#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. Я поддерживаю это, я собирался написать тот же ответ. Вместо этого поднимите голос