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 错误。
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)
我也用这个对象在这个文件中尝试了我的上述尝试,但仍然得到相同的错误。
解决方案
修复了我自己的问题,我需要在外部 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)
推荐阅读
- matlab - 具有 Matlab fitcsvm 的一类和一个特征的 SVM 给出了过度拟合的结果
- jquery - jquery_jeditable:控制来自先例输入的最大数量
- javascript - 在 Vue 应用程序中,Key Up 事件在输入元素上触发。为什么?
- php - Laravel - 无法打开流:没有这样的文件或目录存储/框架/会话
- json - 颤振 - 错误:“Articles”类型的值不能分配给“int”类型的变量
- jquery - 调用函数时服务器端数据表 ajax 返回“数据表警告:表 id=tblDataTable - 无效的 JSON 响应。”
- php - 通过 PHP 中的 Graph API 发布到 Instagram
- ruby - 将数字变成红宝石中的分数?
- tabulator - 制表符 - 布局选项
- html - 将两个图像放在另一个之上