如何让Heroku运行我的子文件夹中的节点应用程序?

时间:2017-07-31 03:19:42

标签: node.js heroku

我有一个节点应用,其入口点在这里

/backend/src/index.js

在本地,如果我尝试从项目根目录运行node ./backend/src/index.js,我会遇到很多路径错误,但如果我cd进入backend文件夹并运行./src/index.js我的节点应用运行。我假设这都是由于通过节点应用程序使用相对路径。

如何将此应用程序部署到heroku并使其正常运行?我目前正在收到像这样的503错误

2017-07-31T03:02:17.759410+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=[redacted] ... dyno= connect= service= status=503 bytes= protocol=https

在执行启动脚本之前,有没有办法告诉heroku cd进入backend文件夹?我可以使用Procfile吗?

2 个答案:

答案 0 :(得分:0)

如果您使用的是Heroku的标准NodeJS buildpack,我可以想办法让您入门。

此buildpack实际上会在您的根路径中搜索package.json(因此这是一项要求)。在package.json中,您可以为应用指定启动脚本,如下所示:

"scripts": {
  "start": "cd backend/src && node index.js"
}

这应该将Heroku指向cd到您的目录中,然后从那里启动服务器。您可以参考相关文档here

答案 1 :(得分:0)

Heroku在存储库的根目录中需要一个package.json和一个锁定文件,否则它们将导致部署失败。

但是,您可以在存储库的根目录中设置一个package.json,以安装子目录的依赖项并运行它们的相关命令。

例如,使用yarn(您可以使用npm进行类似的操作),可以在根目录中放置一个空的yarn.lock,并像这样放置一个package.json

{
  "name": "my-project",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "postinstall": "yarn --cwd <subdirectory> --production=false install",
    "build": "yarn --cwd <subdirectory> serve"
  }
}

--production=false是可选的,但ensures that devDependencies will be installed是可选的,因为在Heroku的环境中NODE_ENV被设置为production,否则不会发生。

Heroku的buildpack默认情况下会安装devDependencies,然后稍后对其进行修剪,因此,如果在部署项目时需要它们中的任何一个来构建项目,则将需要该部分。