私信  •  关注

Aaron Waterman

Aaron Waterman 最近回复了
4 年前
回复了 Aaron Waterman 创建的主题 » 如何在Heroku中运行一个快速服务器来监听MongoDB和socket IO消息?

看来我的问题已经被问过了。

您可以在以下链接中找到答案, Socket.io + NodeJS doesn't work on Heroku

我只是简单的总结一下。

Heroku要求我们的应用程序在从前端到后端通信时在同一端口上运行API的所有功能,反之亦然。所以我第一次尝试指定两个不同的端口在本地工作,但在部署到Heroku时失败了。

然后我尝试对两个服务器实例使用相同的端口。


// implementing express
const express = require('express');
const app = express();

// uses port provided by Heroku OR port 3000
const PORT = process.env.PORT || 3000;

...

// implementing Socket IO
const server = require('http').createServer(app); // creates an instance of an http server
const io = require('socket.io')(server);

...

io.on('connection', client => {

    // server side chat features implemented here

}

server.listen(PORT); 

...

app.listen(PORT); // Express is returning a different instance of the http server

解决方案比我想象的要简单。

由于app.listen(port)返回HTTP服务器的一个实例,所以我们可以将其用于socket io。在单击之前,我必须先查看一些示例代码。全栈Web开发训练营的一位老师将我链接到这个Git Hub存储库,演示如何在将应用程序部署到Heroku时使用socket IO。

请参见以下链接, https://github.com/heroku-examples/node-socket.io/blob/master/server.js

上面示例中的实现看起来有点不同,但实际上正在执行与下面示例中演示的相同的操作,


// get Express library and create Express application
const express = require('express');
const app = express();

// get socket io library
const SocketIO = require('socket.io');

// uses port provided by Heroku OR port 3000
const PORT = process.env.PORT || 3000;

...

// This time we store the HTTP Server instance in a variable
// when we tell the Express application to listen on the specified port
const server = app.listen(PORT); 

// and use that instance to implement our socket io connection
const io = SocketIO.listen(server);

io.on('connection', client => {

    // server side chat features implemented here

}

希望这个解释能帮助别人理解和避免我面临的问题。

并且一定要查看发布的链接,因为我发现它们对于理解我所面临的问题以及如何解决它很有用。