【发布时间】:2023-03-17 04:08:02
【问题描述】:
在我的 REST 调用和一些数据库插入之后,我想通过 socket.io 向前端发出一个新通知,如下所示:
socket.broadcast.emit('send notification', notification);
由于我正在执行此操作的函数是通过 REST 而不是通过 socket.io 触发的,因此我没有变量“socket”。
一开始我以为我可以像这样得到'io':
var io = require('socket.io') // or like: require('socket.io')(3000)
从这里我想我可以得到这样的命名空间:
var nsp = io.of('/notification-list');
nsp.on('connection', function (socket) { ... }
但是 io 似乎是未定义的(或者如果我将它与端口 3000 一起使用,我会得到 EADDRINUSE,因为显然 socket.io 已连接到 127.0.0.1:3000
这可能是一个非常愚蠢的问题,但由于我自己无法弄清楚:如何让socket 准备好在此函数中使用?任何帮助将不胜感激!
编辑:
我尝试了friend00的解决方案,但我仍然无法弄清楚如何做到这一点。
在我的server.js 中,我创建服务器并导入我的 socketIO 内容,如下所示:
var server =
http.createServer(app).listen(app.get('port'), function () {
});
require('./socketio_listener/socketIoListener')(server);
然后我的socketIoListener.js
var sockio = require("socket.io");
var io;
function initIO(server) {
if (!server) { throw new Error("ERR"); }
if (!io) {
io = sockio.listen(server);
}
return io;
}
module.exports.getIO = function () {
if (!io) { throw new Error("ERR"); }
return io;
};
module.exports = function (server) {
io = initIO(server);
var nspNotification = io.of('/notification-list');
nspNotification.on('connection', function (socket) {
socket.on('get notificationList', function (data) {
notification.findNotifications(socket, data);
});
// ...
});
现在我尝试了我想通过 socket.io 发出一些东西的函数:
var io = require("socket.io").getIO();
我也试过了:
var ioServer = require('../socketio_listener/socketIoListener');
ioServer.getIO();
但我仍然总是得到:
TypeError: undefined is not a function
解决方案
我找到了解决方案,虽然我不太清楚之前为什么会出现问题:我将 module.exports.getIO = function () 移到了底部,现在它可以正常工作了。虽然我认为socketIoListener.js 中的位置并不重要,但它似乎确实如此。
【问题讨论】:
标签: javascript node.js socket.io