node.js - 由于权限,npm install 未在 Ubuntu 上安装递归依赖项

标签 node.js permissions npm

问题描述

当使用 sudo npm installpackage.json 在 Ubuntu 服务器上安装 npm 包时,许多依赖项没有安装。在本地运行 npm install 会按预期安装所有内容。该问题似乎是由 node_modules/ 目录中的权限问题引起的。如何确保 npm 能够递归安装所有依赖项?

背景

我正在将 NodeJS 应用程序部署到 Ubuntu 网络服务器。我的所有包都在我的 package.json 文件中定义,如下所示:

{
  "name": "MyApp",
  "engines": {
    "node": "0.10.x",
    "npm": "1.2.x"
  },
  "dependencies": {
    "express": "~3.5.1",
    "jade": "~1.3.1",
    "mongoose": "3.8.8",
    ...
  }
}

当我在本地运行 npm install 时,我能够立即使用 node server.js 启动 Node 服务器而没有任何问题(在运行所有任务/pre -编译作业)。

在服务器上运行 npm install 失败,由于像这样的 EACCES 错误:

npm ERR! error rolling back Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express'
npm ERR! error rolling back  express@3.5.1 { [Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express']
npm ERR! error rolling back   errno: 3,
npm ERR! error rolling back   code: 'EACCES',
npm ERR! error rolling back   path: '/myapp/staging/node_modules/.bin/express' }
npm ERR! Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express'
npm ERR!  { [Error: EACCES, unlink '/myapp/staging/node_modules/.bin/express']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/myapp/staging/node_modules/.bin/express' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

当我在服务器上运行 sudo npm install 时(在删除 node_modules/ 并运行 sudo npm cache clean 之后),npm 获取所有顶级包:

npm http GET https://registry.npmjs.org/jade
npm http GET https://registry.npmjs.org/mongoose
npm http GET https://registry.npmjs.org/express
...

但在安装依赖项时不使用 sudo,因此它们会安静地失败而不会出现任何错误消息。结果是服务器启动失败:

$ node server.js

module.js:340
  throw err;
      ^
Error: Cannot find module './lib/express'
    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> (/myapp/node_modules/express/index.js:4:5)
    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)

解决方案是单独安装每个顶级包,然后正确获取并安装递归依赖项:

$ sudo npm install express
...

然而,这违背了 package.json 的全部目的,更不用说每个新部署都需要大量维护。

最佳答案

不要使用 sudo。您的应用程序的依赖项不需要在系统范围内安装。因此,将您的应用程序代码安装在服务器上的某个普通目录中,然后 cd 进入该目录并以您的普通用户(而非 root)身份运行 npm install 而无需 sudo。 npm 会将您应用程序的所有依赖项(完全递归)放入 node_modules 子目录中,您应该可以开始了。不确定为什么使用 sudo 会失败,但这绝不是一个好主意。请记住,这是从 Internet 下载脚本并以 root 身份运行它们,因为 npm 包可以有安装脚本。以 root 身份运行时会有很多额外的风险。

关于node.js - 由于权限,npm install 未在 Ubuntu 上安装递归依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23071118/

相关文章:

node.js - 如果用户通过 firebase 登录,如何显示不同的页面

python - Django 1.2 对象级权限 - 第三方解决方案?

php - 让 apache 用户使用 shell_exec() 调用脚本;

node.js - npm 坏了,我无法运行任何 npm 命令

javascript - PATH npm 中的空格

python-shell将json从nodejs发送到python

node.js - Nodejs + Expressjs 将 http 响应作为缓冲区获取

node.js - Actor 错误: Cast to ObjectId failed for value "" at path "_id"

PHP:如何检查文件是否不存在或权限被拒绝?

npm run script 导致 Windows Script Host 错误