当它们都需要一个端口时,您不能部署两个单独的服务器。您必须将它们放入单独的应用程序中。在某些情况下,您可以组合 Web 服务器。部署服务器是正常的。
在 Heroku 上部署 Web 服务时,Heroku 为您提供了一个您必须绑定到的端口。然后,您可以在 下访问您的 Web 服务<appname>.herokuapp.com
。(<- 这就是为什么 1.)要求您将它们放入单独的应用程序中。)。此外,当您连接到 Web 服务时,您只需提供 URL。该 URL 会自动翻译成<ipaddress>:<port>
. 因此,在您的前端,您不会指定端口号。您在前端指定 websocket URL,没有任何端口。
在您的 Web 服务器中,您绑定到process.env.PORT
.
.env 文件不应该被版本控制/提交。没用。如果您需要环境变量,您可以通过 Heroku 的仪表板进行设置。Procfile
不是必需的,因为您使用的是 Node.js,它会查看npm start
位于package.json
. 但这并没有什么坏处,因为它提供了清晰性。
没有用于此的多构建包。
如果您的 2 台服务器严格区分并使用单独的协议。一种使用 http,另一种则可以将两台服务器捆绑为一台。这是一个例子:
const http = require('http');
const path = require('path');
const express = require('express');
const WSServer = require('ws').Server;
const DateFormat = require('dateformat');
let wss;
let server;
const app = express();
app.use(express.static(path.join(__dirname, './../build')));
server = new http.createServer(app);
wss = new WSServer({ server })
this.wss = wss;
wss.on('connection', function(socket) {
console.log(DateFormat(new Date(), 'm/d h:MM:ss TT'),
`client connected to server (${wss.clients.size} total)`);
socket.on('message', function(data) {
console.log(data)
});
socket.on('close', function(code, desc) {
console.log(DateFormat(new Date(),
"h:MM:ss TT"),'client disconnected, total:', wss.clients.length);
});
});
wss.on('listening', () => console.log('Websocket listening on port', config.get('port')));
wss.on('error', err => console.log('Websocket server error:', err));
server.on('error', err => console.log('Server error:', err));
server.listen(process.env.PORT);
项目中的示例:
https ://github.com/vegeta897/d-zone/blob/63730fd7f44d2716a31fcae55990d83c84d5ffea/script/websock.js
在该项目中,带有 websocket 服务器的后端被扩展为包括一个为静态文件提供服务的快速服务器。请注意,此更改仅存在于 heroku 分支中。
您将在此提交中找到使该项目 heroku 兼容的所有相关更改:
https ://github.com/vegeta897/d-zone/commit/63730fd7f44d2716a31fcae55990d83c84d5ffea