Heroku Nodejs应用程序启动后崩溃

时间:2020-04-22 15:13:46

标签: node.js heroku

我的nodejs应用在Heroku中崩溃。我有两个在两个不同端口中运行的服务器。一个用于快速路由,另一个用于socket.io。应用程序可以很好地构建并部署在Heroku中。它开始,数据库连接正常,然后服务器守护程序在一段时间内也可以正常工作。然后它将状态更改为崩溃。崩溃后没有错误日志,也没有崩溃的原因。这是Heroku的日志,

2020-04-22T14:52:19.980682+00:00 app[web.1]: > iLearn@1.0.0 start /app
2020-04-22T14:52:19.980683+00:00 app[web.1]: > PORT=5000 node server.js
2020-04-22T14:52:19.980683+00:00 app[web.1]: 
2020-04-22T14:52:20.741515+00:00 app[web.1]: 
2020-04-22T14:52:20.782048+00:00 app[web.1]: API server started on: 5000
2020-04-22T14:52:21.087402+00:00 app[web.1]: Messaging Manager started..
2020-04-22T14:52:21.087501+00:00 app[web.1]: MessagingManager::startDaemon
2020-04-22T14:52:21.089358+00:00 app[web.1]: Messaging server running on port:5001
2020-04-22T14:52:21.130079+00:00 app[web.1]: DB Connected
2020-04-22T14:52:21.132905+00:00 app[web.1]: {"timestamp":"2020-04-22T14:52:21.131Z","message":"DB Connected","level":"info"}
2020-04-22T14:52:26.097164+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:52:31.100561+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:52:36.107406+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:52:41.112479+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:52:46.116481+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:52:51.121785+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:52:56.127394+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:53:01.136499+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:53:06.136680+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:53:11.144029+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:53:16.145616+00:00 app[web.1]: MessagingManager::daemon
2020-04-22T14:53:16.792389+00:00 heroku[web.1]: State changed from starting to crashed

这是我的server.js文件,

const express = require('express')
const MessagingManager = require("./util/messagingManager")

app = express()
bodyParser = require('body-parser');
require('dotenv').config();
port = process.env.PORT || 5000;

app.listen(port);
console.log('API server started on: ' + port);
app.use(express.static('public'))
//app.use(formidable());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.set('view engine', 'pug');
app.set('views', './views')
var routes = require('./routes'); //importing route
app.use('/', routes); //register the route


const messagingApp = express();
const messagingServer = require("http").createServer(messagingApp);
const io = require("socket.io").listen(messagingServer);
let messagingManager = new MessagingManager()
messagingManager.startDaemon()

port = process.env.MESSAGING_PORT || 5001;


io.on("connection", socket => {
    console.log("a user connected");
    let id = socket.handshake.query.id
    console.log(socket.id)
    messagingManager.addConnection(id, socket)

    socket.on("message", msg => {
      if (msg.type == "MESSAGE_READ_STATUS")
       messagingManager.setMessageStatus(msg)
      else
        messagingManager.sendMessage(msg)
    });

    socket.on("disconnect", () => {
      //io.emit("chat message", msg);

    });

    socket.on("endsession", msg => {
      //io.emit("chat message", msg);
      console.log("session ended." + id)
      messagingManager.removeConnection(msg.id)
      socket.disconnect()
    });

    // not used
    socket.on("session", msg => {
      //io.emit("chat message", msg);
      console.log("session established")
      messagingManager.addConnection(msg.id, socket)

    });
});

messagingServer.listen(port, () => console.log("Messaging server running on port:" + port));



1 个答案:

答案 0 :(得分:0)

实际上很难知道为什么应用程序如日志所述崩溃了,应用程序崩溃了却没有任何消息。未引发端口绑定错误,并且调用了应用监听回调函数。实际问题似乎是港口。我在.env和package.json文件中都设置了端口。它会覆盖heroku动态端口。感谢@Beppe C指出这一点。我从.env和package.json删除了端口变量,然后重新部署了该应用程序。现在工作正常。另一个问题是heroku应用程序不允许在同一应用程序中使用两个端口。因此,我必须创建两个应用程序。一个用于快速HTTP路由,另一个用于socket.io。希望对别人有帮助。