在外部处理HTTP服务器时如何在节点中使用Socket.io

时间:2019-01-14 09:59:16

标签: node.js 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错误。

  

获取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服务器实现,如何在app.js中设置socket.io?

编辑1:

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

httpServer.create(httpConfig)

我还在此文件中对该对象进行了上述尝试,但仍然遇到相同的错误。

1 个答案:

答案 0 :(得分:0)

解决了我自己的问题,我需要在外部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)