看来我的问题已经被问过了。
您可以在以下链接中找到答案,
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
}
希望这个解释能帮助别人理解和避免我面临的问题。
并且一定要查看发布的链接,因为我发现它们对于理解我所面临的问题以及如何解决它很有用。