【发布时间】:2019-10-06 08:09:47
【问题描述】:
我正在为 Heroku 设置服务器后端,它正在侦听 google Oauthentication、侦听消息以保存到 Mongo DB,并侦听聊天消息以使用套接字 io 发送给所有连接的用户。
仅供参考,我的应用程序是使用 React 构建的。
在我的本地主机上运行时,我能够让这些功能按预期工作,但我必须在两个不同的端口上设置 socket io 使用的 http 服务器实例和所有其他功能使用的 express 服务器。
但是 Heroku 只允许我访问一个端口。
我一直在网上寻找不同的解决方案。
我最好的选择似乎是尝试让 sockets io 通过同一个端口发送消息,但是当我这样做时,我收到一条错误消息,指出我不能让两个不同的服务器访问同一个端口。
因此,即使我使用相同的 express 实例为套接字 io 创建我的 http 服务器实例,它们也被视为单独的实例。
我的主要问题是,socket io 需要一个 http 服务器实例,并且所有其他功能都可以使用 express 服务器运行。
我想知道是否有人在尝试部署到 Heroku 时遇到过这样的问题?我一直在寻找有类似问题的人,但没有任何运气。我真的可以在这个问题上使用一些指针。
我在下面发布我的服务器代码。
编辑 2019 年 5 月 21 日:我决定减少相关代码,因为有很多与问题无关的内容需要解析。
require(`dotenv`).config();
require("./config/connection");
const express = require('express');
const app = express();
// Routes to Mongo DB
const chatRouter = require('./routes/chat');
// Passport
const passport = require("passport");
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const mongoose = require('mongoose');
const keys = require('./config/keys');
// socket io
const server = require('http').createServer(app);
const io = require('socket.io')(server);
// google
const routes = require("./routes");
const cookieSession = require('cookie-session');
const path = require('path');
const db = require('./model');
const PORT = process.env.PORT || 3001;
// Tells Express to Read the data sent in JSON format
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Tells Express to allows data to be sent across different origins
// required by CORS policy
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
// Implementation of other features such as saving chat messages to database
// and implementing passport
...
// Chat implementation using Socket IO
io.on('connection', client => {
// implementing chat feature
...
});
server.listen('8000', () => {
console.log('listening on port 8000');
});
// alternatively we can attempt to listen on the port specified by Heroku
// server.listen(PORT, () => {
// console.log(`listening on port ${PORT}`);
// });
// implementing more features, such as Google Oauth
// and other api routes
...
// Express application instance listening on port specified by Heroku
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
感谢您在此问题上提供的任何帮助。
谢谢!
【问题讨论】:
标签: javascript node.js reactjs express socket.io