我有一个全栈应用程序,可以在LocalHost上很好地运行,但是一旦将其部署到Web(Heroku或netlify)上,该应用程序就会停止正常运行。我的问题是,为了使后端正常工作并继续使用API以更新前端等,我需要进行哪些必要的更改。我已经尝试在express上更改端口:
const PORT = process.env.PORT || 5000;
app.listen(PORT, "0.0.0.0", err => {
if (err) {
console.error(err)
} else {
console.log(`Running on port ${PORT}`)
} })
我需要为端口添加自己的.env文件,还是heroku自动执行?预先感谢!
答案 0 :(得分:1)
如果您要使用heroku并假设您已经设置好了heroku帐户,并且已经安装并连接了heroku终端(如果您在那儿遇到麻烦,请告诉我)
然后您需要以下内容:
Procfile-该文件告诉heroku使用什么脚本来运行服务器。确保将其命名为Procfile
,并且没有扩展名。
它可以包含类似以下代码的内容
web: yarn heroku-start
-注意,这里我使用yarn
作为我的pacakge管理器,如果您正在使用的话,可以轻松地用npm
替换它。我还调用heroku-start
package.json
这里是pacakge.json
的示例(我仅包括重要的行)
{
...
"scripts": {
"dev": "nodemon -w src --exec \"babel-node src --presets env,stage-0\"",
"build": "babel src -s -D -d dist --presets env,stage-0",
"start": "pm2 start dist",
"prestart": "yarn -s build",
"heroku-prestart": "yarn global add pm2 && pm2 install pm2-logrotate",
"heroku-start": "node dist",
"heroku": "yarn -s build && git add . && git commit -m \"Rebuilt dist folder\" && git push heroku mj/bug/memory-leak:master",
"lint": "eslint src",
"heroku-postbuild": "echo Skip build on Heroku"
},
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-eslint": "^8.0.3",
"babel-preset-env": "^1.6.1",
"babel-preset-stage-0": "^6.24.1",
"eslint": "^4.13.0"
},
"eslintConfig": {
"parserOptions": {
"ecmaVersion": 9,
"sourceType": "module"
},
"env": {
"node": true
},
"rules": {
"no-console": 0,
"no-unused-vars": [
"warn",
{
"argsIgnorePattern": "^_"
}
]
}
},
"heroku-run-build-script": true
}
我正在使用babel
来构建我的项目。请不要对我拥有的大量脚本感到不知所措,其中有些是无用的。但是,您应该注意脚本下的"heroku-start": "node dist"
行-这是我的脚本,用于在heroku上运行我的应用程序。您可以说类似node index.js
之类的信息,因为我正在使用dist
,因为babel正在构建我的应用程序以使其可用于较早的ecma版本,同时允许我使用新的ecma版本,脚本build
是生成我的dist文件夹。
为了您有兴趣,我还提供了我的devDependences。
app.json
-该文件基本上描述了您的heroku应用程序。这是一个样本
{
"name":"myApp",
"description":"my cool app",
"repository":"https://github.com/mycoolapp/",
"logo":"http://node-js-sample.herokuapp.com/node.svg",
"keywords":["node","express","anothertag"],
"image":"heroku/nodejs"
}
完成此操作后,您可以将项目上传到heroku,它应该可以正常运行。您可以在heroku和github上的master分支之间设置一个钩子,以便在推送或合并时自动部署。
下一步:
我注意到您的代码中出现了一些问题,我不建议您在heroku上使用0.0.0.0
,以下是有关https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error为何的一些解释
这是您的新代码
const PORT = process.env.PORT || 5000;
app.listen(PORT, function(err) {
if (err) {
console.error(err)
} else {
console.log(`Running on port ${PORT}`)
}
}
也不要使用箭头功能,因为某些浏览器,heroku可能无法正确构建它(这就是为什么我使用babel的原因)。
最后,这是一个在heroku上创建Node.js应用程序的很好的教程。
https://appdividend.com/2018/04/14/how-to-deploy-nodejs-app-to-heroku/
祝你好运。
答案 1 :(得分:0)
如果要使用netlify,则只能托管静态文件,这意味着如果要这样做,则可能需要将后端与前端代码分开 在heroku中托管后端 和您在netlify上的前端 另外,如果您要在同一服务器上构建后端响应,您还需要一个procfile来告诉heroku如何处理您的应用程序希望这能帮助对netlify / heroku部署感到疑惑的人们