是什么原因导致错误:EACCES:权限被拒绝,访问'/usr/local/lib/node_modules'?

npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/macbookmd101/.npm/_logs/2018-02-21T16_26_08_421Z-debug.log

当前回答

注意所有更改/usr/local下所有目录所有者的响应 基本上,不要破坏Linux系统!!

对于本地的东西使用sudo也是一个非常糟糕的建议。

www.competa.com的原始链接被破坏了,所以这是原始的方法:

npm config set prefix ~/.npm

# open your .bashrc (Linux) or .bash_profile (Mac) file for editing:
nano ~/.bashrc # for Linux
# or...
nano ~/.bash_profile # for Mac if you haven't created a .bashrc file

# add these lines:
export PATH="$PATH:$HOME/npm/bin"
export NODE_PATH="$NODE_PATH:$HOME/npm/lib/node_modules"

# save the file and then enter this command or logout and login to make the changes take effect:
. ~/.bashrc
# or...
. ~/.bash_profile

选项B:使用NVM之类的版本管理器

其他回答

看来你遇到许可问题了。如果您正在安装npm-packages,那么在尝试全局安装包时可能会得到EACCES错误。这意味着你没有权限写入npm用来存储全局包和命令的目录。

尝试执行命令:sudo chmod u+x -R 775 ~/。npm和sudo chown $USER -R ~/。或者你可以用sudo运行任何NPM命令,这应该能解决你的问题。

如果你在本地安装npm-package,那么你应该在你的本地项目目录下,可以尝试运行sudo npm install <pkg-name>命令来安装所需的包。使用sudo的目的是改变你的所有者权限,这样你就可以授权你的当前用户运行NPM命令。

我建议你去https://docs.npmjs.com/getting-started/fixing-npm-permissions看看

我用过sudo,但它没有解决问题, 我已经通过改变node_modules文件夹权限修复了这个问题,

sudo chmod -R 777 node_modules

如果你不为所有用户/组设置权限,你可以用任何其他代码替换777。

如果你在Mac上遇到了这个问题,请遵循以下步骤

首先检查谁是这个文件的所有者使用以下命令

ls -la /usr/local/lib/node_modules

你会在下面找到一些文件其中一个在下面

drwxr-xr-x   3 root    wheel  768 May 29 02:21 node_modules

你有没有注意到上面的文件是由root拥有的,为了在里面做改变,你需要改变所有者的路径。

该命令用于检查谁是当前用户

id -un (in my case user is yamsol)

然后您可以通过调用这个命令来更改(只需将您的用户名替换为ownerName)

sudo chown -R ownerName: /usr/local/lib/node_modules

在我的例子中,你知道用户是“yamsol”,我将以这种方式调用这个命令

sudo chown -R yamsol: /usr/local/lib/node_modules

这是它。

似乎你试图在全局而不是本地安装npm包,正如man npm install所描述的:

-g或——global参数将导致npm在全局而不是本地安装包。

一般来说,当你在设置一个npm项目时(在你可能有的许多其他项目中),在Node.js的全局模块(/usr/local/lib/node_modules)上安装包不是一个好主意,就像你的调试日志建议的那样。

不要使用-g,而是使用——save,它会自动将包保存为包的依赖项。json文件:

是这样的:

$ npm install express-generator --save

$ cat package.json 
{
  "name": "first_app_generator",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
},
  "author": "ivanleoncz",
  "license": "MIT",
  "dependencies": {
    "express-generator": "^4.16.0"
  }
}

但正如其他答案所提到的,如果你要使用-g,你必须在执行npm install express-generator -g时使用sudo(如果你的用户有sudo特权:请参阅/etc/sudoers),但实际上,这不是一个好主意,可能会导致权限问题。

请注意

这里有关于使用-g选项安装express-generator的说明,为了让express-cli.js脚本在系统路径上可用,但是你也可以使用本地安装的脚本,如果你的npm项目位于node_modules:

$ ./node_modules/express-generator/bin/express-cli.js --view=pug myapp

如果出现类似/usr/bin/env: ' node ': No这样的文件或目录,安装nodejs-legacy (Debian/Ubuntu)

恕我直言,如果你不确定结果,使用-g(也使用sudo)就像hic sunt dracones。

欲知更多信息:

创建NPM包(NPM init) Express.js发电机

尝试在您尝试的任何命令之前添加sudo。

像这样:sudo NPM install

在Linux/UNIX中,将sudo与命令一起使用通常会将权限提升到超级用户级别。在Windows系统中,超级用户帐户通常被称为“Administrator”。在Linux/Unix中,超级用户帐户通常命名为“root”。

root用户拥有访问、修改或删除计算机上几乎所有文件的权限。普通用户帐户可以访问、修改或删除的文件要少得多。对普通帐户的限制可保护您的计算机免受未经授权或有害程序或用户的侵害。有些进程要求您对通常没有访问权限的文件或文件夹执行操作。安装一个每个人都可以访问的程序就是这些操作之一。

在本例中,使用sudo运行安装命令可以为您提供超级用户的权限,并允许您修改普通用户没有权限修改的文件。