Как запустить экспресс-сервер, прослушивающий MongoDB и прослушивающий сообщения сокета io в Heroku? - PullRequest
0 голосов
/ 20 мая 2019

Я устанавливаю серверную часть для 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}`);
});

Я ценю любую помощь, которая может быть оказана в этом вопросе.

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2019

Похоже, мой вопрос уже был задан и получен ответ.

Ответ можно найти по следующей ссылке: Socket.io + NodeJS не работает на 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.Я должен был взглянуть на некоторый пример кода, прежде чем он нажал.Один из учителей из полного стека Bootcamp для веб-разработки связал меня с этим репозиторием git hub, демонстрирующим, как использовать сокет ввода-вывода при развертывании приложения в Heroku.

см. Следующую ссылку: 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

}

Надеюсь, это объяснение поможет другим понять и избежать проблемы, с которой я столкнулсялицом к лицу.

И обязательно ознакомьтесь с опубликованными ссылками, так как я нашел их полезными для понимания проблемы, с которой я столкнулся, и способов ее решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...