有时它可以工作(可以在部署的Express.js应用程序上导航到我的api),有时却不起作用(改为显示应用程序错误)。我制作的Express应用程序从express generator命令开始,该命令生成带有主页的默认Express项目。还需要注意的是,端口不是在app.js内定义的,而是在bin文件夹内的www文件中定义的。如下所示(实际上,您可以输入命令来生成express,使其具有与我的几乎相同的解决方案项目,但是www绝对相同):
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
我将“ web:node ./bin/www”放在我的项目根目录中的Procfile上,因为www位于bin文件夹内。
web: node ./bin/www
在package.json上,我有
"scripts": {
"start": "node ./bin/www"
},
我按照以下顺序清楚地遵循了说明:
heroku login
git init
heroku git:remote -a myapp
git add .
git commit -am "make it better"
git push heroku master
在第一次启动该应用程序时,所有内容,我的主页,api等都可以正常运行,但是一段时间后,当我浏览我的应用程序时,出现应用程序错误,然后又可以正常运行,等等。
这是我通过输入“ heroku logs --tail”命令得到的错误:
2019-05-13T21:10:42.528090+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/api/items" host=fmjapi.herokuapp.com request_id=d8b9ad7b-73f5-42fa-915e-c4da9e0660
c5 fwd="109.128.144.114" dyno= connect= service= status=503 bytes= protocol=https
2019-05-13T21:10:42.765654+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=fmjapi.herokuapp.com request_id=4767c4a4-3fcf-4bca-bb09-cb208a5e
e443 fwd="109.128.144.114" dyno= connect= service= status=503 bytes= protocol=https
它说desc =“ App崩溃了” method = GET path =“ / api / items”,我认为问题应该在items文件中。但是,有时候它可以完美地工作,真是太奇怪了,所以我对此表示怀疑,但是无论如何,这里是:
Items.js
const express = require('express');
const connection = require('../db');
let router = express.Router();
router.get('/', function (req, res) {
connection.dbConnection.query(connection.QUERIES[0], function (error, result) {
if (error) res.sendStatus(500);
else {
res.json(result);
}
})
});
router.put('/:id/found', function (req, res) {
let id = req.params['id'];
let isFound = parseInt(req.body.isFound);
if (isFound !== 1) return res.sendStatus(400);
connection.dbConnection.query(connection.QUERIES[1], [isFound, id], function (error) {
if (error) res.sendStatus(500);
else {
res.sendStatus(200);
}
})
});
router.put('/:id/searching', function (req, res) {
let id = req.params['id'];
let searching = parseInt(req.body.searching);
if (searching !== 1) return res.sendStatus(400);
connection.dbConnection.query(connection.QUERIES[2], [searching, id], function (error, result) {
if (error) res.sendStatus(500);
else {
res.sendStatus(200);
}
})
});
module.exports = router;
您在上面看到的connection.QUERIES [number]只是我在db.js数组QUERIES中定义的sql查询
每当我部署的应用正常运行时,这就是我从heroku logs --tail命令获得的信息:
2019-05-13T21:23:31.919159+00:00 heroku[router]: at=info method=GET path="/api/items/" host=fmjapi.herokuapp.com request_id=c4dc809d-2418-494c-a2a6-6a259bab3c0e fwd="109.128.144.114" dyn
o=web.1 connect=0ms service=24ms status=304 bytes=325 protocol=https
2019-05-13T21:23:31.915276+00:00 app[web.1]: GET /api/items/ 304 23.439 ms - -
更不用说,该项目已经对其他远程存储库进行了git init,但是后来我删除了那些较旧的远程设备,因为我不再需要那些。因此,我的项目连接到的唯一远程仓库是heroku。
哦,最后一件事:我正在使用免费版的Heroku。
更新
我删除了
"scripts": {
"start": "node ./bin/www"
},
从我的package.json中提交并推送到heroku。你猜怎么着?没有它就可以工作!看起来从Procfile运行的脚本就足够了。可能与在package.json和Procfile上运行相同的脚本有双重关系吗?有时这可能是导致应用中断的原因。
更新2
我从json包中删除了脚本运行代码,只允许运行Procfile的代码。可悲的是,我仍然收到此应用程序错误。