我有一个运行在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)
我还在此文件中对该对象进行了上述尝试,但仍然遇到相同的错误。
答案 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)