安装npm模块时出现权限拒绝问题

28

在安装npm模块时,我遇到了奇怪的权限错误。我使用sudo启动它,所以我确信我有权限访问,但出现以下错误:

stack Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/joplin/node_modules/sqlite3/build'

我尝试重新启动电脑,并创建一个带有chmod 777的目录/usr/lib/node_modules/joplin,但仍然不起作用。

$ sudo npm install -g joplin
/usr/bin/joplin -> /usr/lib/node_modules/joplin/main.js

> sqlite3@3.1.9 install /usr/lib/node_modules/joplin/node_modules/sqlite3
> node-pre-gyp install --fallback-to-build

node-pre-gyp ERR! Tried to download(undefined): https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v3.1.9/node-v48-linux-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for sqlite3@3.1.9 and node@6.11.2 (node-v48 ABI) (falling back to source compile with node-gyp)
gyp ERR! configure error
gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/joplin/node_modules/sqlite3/build'
gyp ERR! stack     at Error (native)
gyp ERR! System Linux 4.4.0-43-Microsoft
gyp ERR! command "/usr/bin/nodejs" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/usr/lib/node_modules/joplin/node_modules/sqlite3/lib/binding/node-v48-linux-x64/node_sqlite3.node" "--module_name=node_sqlite3" "--module_path=/usr/lib/node_modules/joplin/node_modules/sqlite3/lib/binding/node-v48-linux-x64"
gyp ERR! cwd /usr/lib/node_modules/joplin/node_modules/sqlite3
gyp ERR! node -v v6.11.2
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute '/usr/bin/nodejs /usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/usr/lib/node_modules/joplin/node_modules/sqlite3/lib/binding/node-v48-linux-x64/node_sqlite3.node --module_name=node_sqlite3 --module_path=/usr/lib/node_modules/joplin/node_modules/sqlite3/lib/binding/node-v48-linux-x64' (1)
node-pre-gyp ERR! stack     at ChildProcess.<anonymous> (/usr/lib/node_modules/joplin/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack     at emitTwo (events.js:106:13)
node-pre-gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
node-pre-gyp ERR! stack     at maybeClose (internal/child_process.js:891:16)
node-pre-gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
node-pre-gyp ERR! System Linux 4.4.0-43-Microsoft
node-pre-gyp ERR! command "/usr/bin/nodejs" "/usr/lib/node_modules/joplin/node_modules/sqlite3/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /usr/lib/node_modules/joplin/node_modules/sqlite3
node-pre-gyp ERR! node -v v6.11.2
node-pre-gyp ERR! node-pre-gyp -v v0.6.36
node-pre-gyp ERR! not ok

编辑

我也尝试了sudo npm i sqlite3 -g --build-from-source,但是出现相同的错误Error: EACCES: permission denied, mkdir '/usr/lib/node_modules/sqlite3/build',所以似乎与sqlite3有关。

3个回答

54

您需要重新获取对.npm目录的所有权。

sudo chown -R $(whoami) ~/.npm

并且需要在 node_modules 目录中拥有写入权限:

sudo chown -R $(whoami) /usr/lib/node_modules

3
$(whoami) 是什么? - lxknvlk
5
whoami是Linux命令,用于显示当前登录的用户,$(whoami)会返回该命令的输出结果。 - Abhishek Singh
9
"who am I" 命令用来回答关于生命的哲学问题。 - AnchovyLegend
4
全局 npm 目录在不同情况下可能会有所不同。你可以尝试在 /usr/local/lib/node_modules 上运行该命令。请注意,这是一条建议,您需要根据实际情况自行判断是否适用。 - Abhishek Singh
5
由于某种原因,在执行这些命令后,使用sudo npm i会失败并给出相同的错误信息,但是在没有使用sudo的情况下却可以运行成功! - Katia Savina
显示剩余2条评论

5

我学到的一条经验法则是永远不要使用sudo运行npm install。这会创建一个所有者为root而不是你的用户名的项目。

最好将目录的所有权更改为你的用户名。$(whoami)


-1

给予 node modules 文件夹完全权限

命令

sudo chmod 777 -R node_modules/


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