![](/img/trans.png)
[英]Is there a way to trigger the socket.io connection event from NodeJS?
[英]Socket.io trigger event from controller of HTTP API
在我的Node + Express服务器应用程序中,我想从特定控制器发出通知,这些通知由HTTP API发出的请求触发:
例如:
router.route('/status').put(Order.changeStatus)
class Order {
static changeStatus(req, res) {
// Modifying database record with changed status
// Emiting message to specific socket room
}
}
我正在按以下方式处理套接字连接:
import AuthMiddleware from '../middleware/AuthMiddleware';
const socketio = require('socket.io');
let io;
module.exports.listen = function(app){
io = socketio.listen(app);
io.on('connection', function(socket){
console.log('Client connected');
AuthMiddleware.authenticateSocket(socket, (err, user) => {
socket.join(user._id);
console.log('Client joined to: ' + user._id);
})
socket.on('disconnect', () => {
console.log('Client disconnected')
});
});
return io;
}
在对传入的套接字连接进行身份验证之后,它将订阅到其自己的ID房间。
套接字在项目顶部被初始化,如下所示:
import app from './app';
import http from 'http';
const PORT = process.env.PORT || 7235;
const server = http.createServer(app);
const io = require('./socket/main').listen(server);
// App start
server.listen(PORT, err => {
console.log(err || `Server listening on port ${PORT}`);
});
尽管我能够处理传入事件并对其进行响应,但是这种结构的问题在于,我无法访问控制器中的io对象以能够在特定房间中发出数据,如下所示:
io.sockets.in(userID).emit('notification', data);
能够从HTTP API的控制器触发套接字事件的正确结构是什么?
您的控制器需要有权访问已配置的io对象。 最简单的方法是将其导出到模块中,而不仅仅是导出listen函数,也许像这样:
import AuthMiddleware from '../middleware/AuthMiddleware';
const socketio = require('socket.io');
let io;
function listen(app){
io = socketio.listen(app);
io.on('connection', function(socket){
console.log('Client connected');
AuthMiddleware.authenticateSocket(socket, (err, user) => {
socket.join(user._id);
console.log('Client joined to: ' + user._id);
})
socket.on('disconnect', () => {
console.log('Client disconnected')
});
});
return io;
}
module.exports = {
listen, io
}
然后您的控制器就可以执行const io = require('./path/to/that').io;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.