首页 > 解决方案 > 在外部处理 http 服务器时如何在节点中使用 Socket.io

问题描述

我有一个在 node.js 上运行的 Web 应用程序,我想在我的数据库更新时使用 socket.io 向客户端发送数据。

问题是,我发现的大多数解决方案都涉及添加app.js如下行:

var app = express()
var http = require('http')
var server = http.createServer(app);
var io = require('socket.io')(server)

但我的服务器实现是在一个外部 js 文件 ( http-server.js) 中处理的,如下所示:

import http from 'http'
import app from '../lib/app'

class HTTPServer {
    constructor(app) {
        this.app = app
    }

    create(options) {
        this.server = http.createServer(this.app)

        this.server.on('error', err => {
            console.log(`HTTP:   ${err}`)
            throw err
        })

        this.server.listen(options.port)
    }
}

export default new HTTPServer(app)

在我的 PUG 模板中,我有:

var socket = io()
socket.on('hello', function(msg) {
        console.log(msg)
});

所以我在设置套接字app.js时遇到了麻烦,因为我有:

io.on('connection', (socket) => {
    console.log("connected")
    io.emit('hello', "hello world")
})

客户端抛出 404 错误。

GET http://localhost:8080/socket.io/?EIO=3&transport=polling&t=MXBmiMH 404(未找到)

我努力了

const app = express()
var http = require('http').Server(app);
var io = require('socket.io')(http);

import HTTPServer from '../lib/http-server'
const app = express()
var io = require('socket.io').listen(HTTPServer);

但是两者都在客户端上抛出了相同的 404 错误。

所以我的问题是,鉴于我的 http 服务器实现,我该如何设置 socket.io app.js

编辑1:

http 对象是在 中创建的index.js,具有以下行

httpServer.create(httpConfig)

我也用这个对象在这个文件中尝试了我的上述尝试,但仍然得到相同的错误。

标签: node.jshttpsocket.io

解决方案


修复了我自己的问题,我需要在外部 js 文件中进行套接字初始化,就像这样

import http from 'http'
import app from '../lib/app'

class HTTPServer {
    constructor(app) {
        this.app = app
    }

    create(options) {
        this.server = http.createServer(this.app)

        this.server.on('error', err => {
            console.log(`HTTP:   ${err}`)
            throw err
        })

        this.server.listen(options.port)

        const io = require('socket.io')(this.server);

        io.on('connection', (socket) => {
            console.log("connected")
            io.emit('hello', "hello world")
        })

    }
}

export default new HTTPServer(app)

推荐阅读