Как я могу подключить один и тот же порт на Expressjs и Socket.io

#node.js #express #socket.io

Вопрос:

Я использую Express.js amp; Разъем.io для разработки приложения для чата.

В первый раз я создаю свой проект с помощью экспресс-генератора и начинаю со скрипта node ./bin/www, но я удаляю весь файл ./bin/www и объединяю с app.js

Я использую HTTPS в рабочем режиме и использую HTTP в режиме разработки.

Поэтому я пишу такой код.

[app.js]

 require('dotenv').config()
const express = require('express');
const path = require('path');
const fs = require('fs')
const app = express();
let io = require('socket.io')(app)   // I Attach (app) here!!

const https = require('https')
const http = require('http')
const PORT = process.env.PORT || 443;
const domain = 'example.com';
const option = process.env.NODE_ENV === "production" ? {
    ca: fs.readFileSync('/etc/letsencrypt/live/'   domain   '/fullchain.pem'),
    key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/'   domain   '/privkey.pem'), 'utf8').toString(),
    cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/'   domain   '/cert.pem'), 'utf8').toString(),
  } :
  undefined;

// In Production Mode use HTTPS Server
// In Development Mode use HTTP Server

/* HTTPS Server */
option
  ?
  https.createServer(option, app).listen(PORT, () => {
    console.log(`Server is running at port ${PORT}`);
  }) :
  undefined;
/* HTTP Server */
option
  ?
  http
  .createServer(function (req, res) {
    res.writeHead(301, {
      Location: "https://"   req.headers["host"]   req.url
    });
    res.end();
  })
  .listen(80) :
  http.createServer(app).listen(PORT, () => {
    console.log(`Server is running at port ${PORT}`);
  });
 

И когда я запускаю приложение, оно показывает мне такую ошибку.

 UserssuperDownloadsprojectbuildnode_modulessocket.iolibindex.js:258
    throw new Error(msg);
    ^

Error: You are trying to attach socket.io to an express request handler function. Please pass a http.Server instance.
    at Server.listen.Server.attach (C:UserssuperDownloadsprojectbuildnode_modulessocket.iolibindex.js:258:11)
    at new Server (C:UserssuperDownloadsprojectbuildnode_modulessocket.iolibindex.js:59:17)
    at Server (C:UserssuperDownloadsprojectbuildnode_modulessocket.iolibindex.js:44:41)
    at Object.<anonymous> (C:UserssuperDownloadsprojectbuildapp.js:13:30)
    at Module._compile (internal/modules/cjs/loader.js:1156:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)
    at Module.load (internal/modules/cjs/loader.js:1000:32)
    at Function.Module._load (internal/modules/cjs/loader.js:899:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47
Program node app.js exited with code 1
 

В сообщении об ошибке говорилось, что это должен быть экземпляр сервера attach,
Поэтому я несколько раз изменяю свою строку code .createServer, но она не работает.

Но когда я использую другой порт (например, 3000), он работает нормально. Но я хочу использовать тот же порт.

И я вставил код ввода-вывода сокета в то же самое app.js.

Это часть кода socketio.

 /* Socket IO Functions */
io.on('connection', function (socket) {
  // Join Room Scoket
  socket.on('JoinRoom', function (data) {
    socket.leave(`${data.leave}`)
    // console.log(`Leave ROOM : ${data.leave}`)
    socket.join(`${data.joinedRoomName}`);
    // console.log(`NEW JOIN IN ${data.joinedRoomName}`)
    // console.log(`RECEIVER : ${data.receiver}`)
    // When Reads the message SET notice to '1'
    // db.query(`UPDATE chatData SET notice='1' WHERE chatReceiver=? AND roomName=?`, [data.receiver, data.joinedRoomName])

    Chat.aggregate([{
        $match: {
          'chatReceiver': data.receiver,
          'roomName': data.joinedRoomName,
          'chatNotice': 1
        }
      },
      {
        $set: {
          'chatNotice': 0
        }
      }
    ], (err, result) => {
      if (err) throw err;
      // console.log(result);
    })
  })

 

[Код на Лицевой Стороне]

 /* Global */
let socket = io.connect('http://127.0.0.1:3000'); // But I want to use 80 or 443 port 
 

Как я могу решить эту проблему?

Комментарии:

1. Взгляните на экспресс и сокет. документы ввода-вывода. Вы можете обрабатывать и то, и другое с помощью одного экземпляра сервера, следовательно: они «работают» на одном и том же порту

Ответ №1:

Как описано в сообщении об ошибке, показанном в вашем вопросе, сокет.для ввода-вывода требуется экземпляр http.Server .

Что вам нужно сделать, так это позвонить app.listen , чтобы получить экземпляр http.Server , а затем передать его socket.io, например:

 var PORT = process.env.PORT || 3000
var app = express()
var server = app.listen(PORT, function() {
    console.log('server listening at', server.address())
})
var io = require('socket.io')(server)
 

Комментарии:

1. Я поддерживаю это, я собирался написать тот же ответ. Вместо этого поднимите голос