Я устанавливаю серверную часть для Heroku, которая прослушивает проверку подлинности Google, прослушивает сообщения для сохранения в Mongo DB и прослушивает сообщения чата для отправки всем подключенным пользователям через сокет io.
Просто мое приложение было построено с использованием React.
Мне удалось заставить эти функции работать должным образом при работе на моем локальном хосте, но мне пришлось настроить экземпляр http-сервера, используемого сокетом io, и экспресс-сервер, используемый всеми другими функциями на двух разных портах.
Однако Heroku дает мне доступ только к одному порту.
Я искал в Интернете различные решения.
Кажется, лучше всего пытаться получить сокеты io для отправкисообщения через один и тот же порт, однако, когда я делаю это, я получаю сообщение об ошибке, в котором говорится, что два разных сервера не могут получить доступ к одному и тому же порту.
Так что, хотя я использую один и тот же экземпляр Expressчтобы создать мой экземпляр http-сервера для сокета io, они считаются отдельными экземплярами.
Моя основная проблема заключается в том, что для сокета io требуется экземпляр http-сервера, и любая другая функция может быть запущена с использованиемЭкспресс-сервер.
Мне было интересно, сталкивался ли кто-нибудь с такой проблемой при попытке развертывания в Heroku?Я искал кого-то с подобной проблемой и не повезло.Я мог бы действительно использовать некоторые указатели по этой проблеме.
Я публикую свой серверный код ниже.
Редактировать 21.05.2009: Я решил сократить до соответствующего кода, так как былмного разборов, которые не имеют отношения к вопросу.
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}`);
});
Я ценю любую помощь, которая может быть оказана в этом вопросе.
Спасибо!