我在我的机器上制作了一个应用程序,它运行良好。我将它上传到服务器,它崩溃了,出现以下错误:
node.js:116
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Cannot find module 'xml2js'
at Function._resolveFilename (module.js:289:11)
at Function._load (module.js:241:25)
at require (module.js:317:19)
at Object.<anonymous> (/var/www/node/price/index.js:3:14)
at Module._compile (module.js:373:26)
at Object..js (module.js:379:10)
at Module.load (module.js:305:31)
at Function._load (module.js:271:10)
at Array.<anonymous> (module.js:392:10)
at EventEmitter._tickCallback (node.js:108:26)
这就是我的应用开始的方式:
var express=require('express');
var http=require('http');
var xml2js = require('xml2js');
var sys = require('sys');
var util = require('util');
我已经使用npm安装了express和xml2js。我的机器和服务器上的节点的版本完全相同(v0.4.0)。
我确保xml2js和express驻留路径(/ usr / local / lib / node /)包含在节点查找模块的路径中。 (我编辑了'module.js'文件来打印它寻找模块的路径。)
node.js:116
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Cannot find module 'xml2js', in paths: /root/.node_modules,/root/.node_libraries,/usr/local/lib/node,/var/www/node/price/node_modules,/var/www/node/node_modules,/var/www/node_modules,/var/node_modules,/node_modules
at Function._resolveFilename (module.js:289:11)
at Function._load (module.js:241:25)
at require (module.js:317:19)
at Object.<anonymous> (/var/www/node/price/index.js:3:14)
at Module._compile (module.js:373:26)
at Object..js (module.js:379:10)
at Module.load (module.js:305:31)
at Function._load (module.js:271:10)
at Array.<anonymous> (module.js:392:10)
at EventEmitter._tickCallback (node.js:108:26)
那有什么不对?我有正确的道路,模块就在那里。为什么节点找不到呢?完全相同的代码在我的本地机器上顺利运行。如果重要,我的机器是Mac,服务器运行CentOS。
答案 0 :(得分:17)
require.paths.push('/usr/local/lib/node_modules');
对节点v0.8.1及更高版本不再有效。您可以设置环境变量 NODE_PATH
,而不是使用 require.paths.push 。export NODE_PATH=/usr/local/lib/node_modules
或者如果您在主目录中安装npm模块,那么
export NODE_PATH=~/.npm
答案 1 :(得分:11)
正如spmason所提到的,Node改变了模块的解析方式。我遇到了与您相同的问题并通过全局安装所有模块(--global
)并在需要任何模块之前将/usr/local/lib/node_modules
添加到require来解决此问题:
require.paths.push('/usr/local/lib/node_modules');
require('blah'); // it works!
答案 2 :(得分:6)
节点0.4改变了modules are resolved及其appears that this breaks xml2js的方式。
答案 3 :(得分:3)
节点0.4在./node_modules
中查找模块。
对我来说,只需将模块目录链接到我的项目目录ln -s /usr/local/lib/node node_modules
答案 4 :(得分:1)
就个人而言,我发现需要在本地通过npm安装XML2JS模块。虽然我只是在Windows上试过这个,但我写了一篇博文here
答案 5 :(得分:0)
尝试在项目中安装它而不是全局包目录。
如果您使用package.json
来管理相关性,那么您只需在项目目录中运行npm bundle
,然后在应用文件的顶部添加require.paths.unshift('./node_modules')
即可。在我看来,这是所有项目的最佳实践(特别是考虑到节点开发的速度)。
答案 6 :(得分:0)
我想简单的答案是xml2js和xml2js-xpat的当前包被破坏了。
我最终使用了node-xml。我希望xml2js不是我试图安装的第一个npm模块。
答案 7 :(得分:0)
只需制作ln -s /usr/local/lib/node /usr/local/lib/node_modules
,但在将node_modules
的内容移至原始节点库node
之前 - 它帮助了我:)
答案 8 :(得分:0)
尝试安装带有-g
标志的npm软件包以使其具有全局性
npm install -g package_name