什么是在部署环境中启动nodemon的正确方法?

时间:2017-09-16 17:22:34

标签: node.js npm nodemon

我似乎遇到了在已部署的实例中从node_modules运行nodemon的问题。

我在package.json

中大致有这个
{
   ...
  "version": "0.0.3",
  "main": "dist/src/server.js",
  "description": "Persistence Layer",
  "engines": {
    "node": "~6.7"
  },
  "scripts": {
    "start": "nodemon",
  },
"dependencies": {
    ...
    "nodemon": "^1.11.0",
    ...
  }
}

我的nodemon.json文件中有以下内容

{
  "restartable": "rs",
  "verbose": true,
  "debug": 5858,
  "delay": 1,
  "watch": [
    "dist/",
    "node_modules/"
  ],
  "ext": "js",
  "args": [
    "--debug=5858",
    "--max_old_space_size=6384",
    "--optimize_for_size",
    "--max_executable_size=6384",
    "--stack_size=6384"
  ]
}

当我尝试npm run start时,我得到以下内容:

jrlil@28178a64e860:/app# npm run start
npm info it worked if it ends with ok
npm info using npm@3.10.8
npm info using node@v6.9.1
npm info lifecycle api@0.0.3~prestart: api@0.0.3
npm info lifecycle api@0.0.3~start: api@0.0.3

> api@0.0.3 start /app
> nodemon

sh: 1: nodemon: Permission denied

npm info lifecycle -api@0.0.3~start: Failed to exec start script
npm ERR! Linux 3.10.0-514.16.1.el7.x86_64
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "start"
npm ERR! node v6.9.1
npm ERR! npm  v3.10.8
npm ERR! code ELIFECYCLE
npm ERR! -api@0.0.3 start: `nodemon`
npm ERR! Exit status 126
npm ERR!
npm ERR! Failed at the -api@0.0.3 start script 'nodemon'.
npm ERR! Make sure you have the latest version of node.js and npm installed.

然而,当我使用以下内容运行它时,一切都按预期工作。

$node node_modules/nodemon/bin/nodemon.js
[nodemon] 1.12.1...

为什么npm run无法查看我的node_modules文件夹并启动nodemon?

1 个答案:

答案 0 :(得分:0)

这实际上是一个Linux问题而不是Node问题,因为这是一个权限问题 - 由npm运行的脚本nodemon没有正确的权限。

如果您使用npm run start来调用nodemon拥有正确的权限(例如root),npm会将执行“切换”到{ {1}}并且在此过程中可能会将用户更改为没有root权限的用户,以确保安全:

From the docs:

  

如果使用root权限调用npm,那么它将更改uid   到用户配置指定的用户帐户或uid,其中   默认为无人。设置unsafe-perm标志以使用root运行脚本   特权。

如果您自己运行nodemon(并且您拥有root权限),则会绕过“切换”,以便以root权限运行node_modules/nodemon/bin/nodemon.js

部署节点应用程序的最正确的方式是使用pm2之类的东西来管理进程,而不使用nodemon,因为nodemon主要用于监视更改并重新启动服务器(这大多只在开发环境中有用)。如果您仍想使用nodemon,可以combine it with the forever package with nodemon like explained here