nodemon:在heroku上部署时拒绝许可

zfciruhq  于 2023-10-17  发布在  Node.js
关注(0)|答案(3)|浏览(134)

我在使用Heroku部署时在日志中收到以下错误,我该怎么办?
我的procfile

web: node bin/www

我的package.json

{
  "name": "express-generator",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "./node_modules/.bin/nodemon.cmd  ./bin/www"
  },
  "dependencies": {
    "config": "^3.3.1",
    "cookie-parser": "~1.4.4",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "jsonwebtoken": "^8.5.1",
    "mongoose": "^5.9.29",
    "morgan": "~1.9.1",
    "passport": "^0.4.1",
    "passport-jwt": "^4.0.0",
    "passport-local": "^1.0.0",
    "passport-local-mongoose": "^6.0.1",
    "pug": "^3.0.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.4"
  }
}
izkcnapc

izkcnapc1#

Nodemon是一个开发工具,不应该在生产中使用:
Nodemon是一个实用程序,它将监视源代码中的任何更改并自动重新启动服务器。非常适合发展。
在Node.js项目中,如果Heroku找不到Procfile,它会默认运行start脚本。您的start脚本是

"./node_modules/.bin/nodemon.cmd  ./bin/www"

看起来你是在 * 尝试 * 使用Node.js而不是Nodemon,把它放在你的Procfile中:

web: node bin/www

但看起来这个文件命名不正确。大写的P很重要。转换为Procfile,例如运行git mv procfile Procfile。然后提交更改并重新部署。
请注意,您也可以像Heroku一样使用heroku local命令在本地运行应用程序,以确保Procfile正在执行它应该执行的操作。

ac1kyiln

ac1kyiln2#

你不应该在“生产”中使用nodemon,而应该使用node。同样在你的package.json中,nodemon被声明为一个dev依赖项,所以它不会通过npm安装在你的heroku示例上,因为我认为npm install --production将由heroku执行,所以如果你在启动脚本中调用它,它不会找到它。

  • 编辑你的npm脚本“start”在package.json到"start": "node index.js"例如,如果index.js是你的入口点。因为heroku默认使用start脚本来启动你的程序。
  • 你也可以添加一个脚本“dev”,让你在你的开发环境"dev": "nodemon index.js"中使用nodemon例如,如果index.js是你的入口点,那么你可以通过在终端中键入npm run dev来启动nodemon应用程序
ttvkxqim

ttvkxqim3#

首先,请遵循这里其他人的建议:nodemon不应用于生产。把它留给开发机器,直接在prod上运行node ./bin/www
例如,在一个示例中,

// package.json
  "scripts": {
    "start": "node ./bin/www",
    "dev": "nodemon ./bin/www"
  }

现在谈谈你的问题。
nodemon将其可执行文件安装到node_modules/.bin/中。它为不同的操作系统安装可执行文件:

  • nodemon和用于Linux的Bash语法,
  • nodemon.cmdnodemon.ps1用于Windows(CMD和PowerShell)。

"start": "./node_modules/.bin/nodemon.cmd ./bin/www"对于Windows来说是非常好的(看起来你是用它来开发的-我想它是有效的:)
但是对于Linux服务器(Heroku在您的案例中提供了),nodemon.cmd不是一个选择。
️如果你真的想在Linux上运行它,请执行"start": "nodemon ./bin/www"
️但是你不应该在prod上做:)
Linux可能没有为./node_modules/.bin/nodemon设置正确的权限:

$ ls -al node_modules/.bin/nodemon*
-rw-r--r-- 1 rom rom 312 Oct  7 21:39 node_modules/.bin/nodemon
-rw-r--r-- 1 rom rom 327 Oct  7 21:39 node_modules/.bin/nodemon.cmd
-rw-r--r-- 1 rom rom 813 Oct  7 21:39 node_modules/.bin/nodemon.ps1

它可以通过以下方式修复:

$ chmod a+x node_modules/.bin/nodemon

相关问题