Node.js无法找到已安装的模块。

4

在将我的node.js应用程序部署到另一台计算机后(在开发机器上运行得很完美),并手动安装所有依赖项后,当我尝试执行它时,出现以下错误:

    C:\Users\myself>node app.js
module.js:340
    throw err;
    ^

Error: Cannot find module 'xmlhttprequest'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (c:\Keystroke\node_modules\socket.io\node_modules\socket.io-client\node_modules\engine.io-client\lib\transports\index.js:5:22)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (c:\Keystroke\node_modules\socket.io\node_modules\socket.io-client\node_modules\engine.io-client\lib\socket.js:5:18)

如果我运行
npm ls -g

它返回全局安装的模块列表,其中包括 xmlhttprequest。那么为什么我的应用程序无法找到它?我做错了什么吗?

也许必须在本地安装? - Rokie
@RoKie83 在该文件夹上运行 npm ls 命令返回的列表中并不包含它,因此我认为这不是问题所在。 - Arcadio Garcia
请展示您在xmlhttprequest中使用require()的代码。 - jfriend00
@jfriend00 这不是我的代码,正如您在堆栈跟踪中看到的那样,是socket-io模块需要它。 - Arcadio Garcia
嗯,这里似乎有些不对劲。我想知道为什么你需要在服务器上使用 xmlhttprequest 模块。当我使用 socket.io 时,从未必须在我的服务器上安装该模块。 - jfriend00
我不知道,但在本地安装socket-io解决了问题。 - Arcadio Garcia
2个回答

19

这个模块可能还需要在项目中进行本地安装。

您是否有一个package.json文件?如果有,请运行:

npm install --save xmlhttprequest

下次进入你的仓库目录时,请执行npm install命令,这样当你切换机器时,可以获取所有依赖项。

有些依赖项在全局安装到机器上时并不常用。


一个模块可以在全局或本地工作。如果是本地的话,在要求它时必须使用不同的路径,但无论哪种方式都可以工作。 - jfriend00
@eddyjs 它起作用了!这让我很惊讶,为什么它要在本地安装呢? - Arcadio Garcia
通常情况下,如果依赖项是从命令行运行的,则应全局安装它们;如果您希望它们在项目中被“需要”,则应将其安装在本地。本地安装意味着它们将位于node_modules文件夹中,这是require语句查找的第一个位置。正如jfriend00所说,全局安装具有不同的路径,您可以在技术上找到它,但设置方式不值得麻烦。 - eddyjs

1

你所说的“手动安装所有依赖项”是什么意思?

通常,我们会通过 npm install --savenpm install --save-dev 安装依赖项,当我需要迁移到另一个环境时,只需克隆源代码并在项目根目录中运行 npm install,它就会为我完成所有操作。

有时如果您使用的软件包是 C++ 插件,则可能会出现问题,如果您使用的 Node 版本与开发环境和生产环境不同,则可能无法安装。请小心。我通常使用 nvm 进行节点版本管理,对于 Windows 系统使用 nvmw,这可以为我节省大量时间。


我是指 npm install whatever -g,因为目前我正在从自定义脚本安装,并且我没有 package.Jason 包。我会看看 nvm! - Arcadio Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接