我试图在我的节点项目上使用套接字。这就是它基本上如何运作:
/
|-> controllers/
| |-> home.js
|-> app.js
|-> sockets.js
/app.js
在app上,我调用sockets.js来启动套接字服务器:
var express = require('express');
var sockets = require('./sockets');
var app = module.exports = express();
var server = app.listen(config.PORT);
var io = sockets(server);
/sockets.js
在此文件中,我启动套接字服务器,然后返回io。
var socket = require('socket.io');
module.exports = function(server) {
var io = socket.listen(server);
io.sockets.on('connection', function(socket) {
// Here I can call every socket I want (if I have the socket_id) with this code :
var socket = io.to(socket_id);
socket.emit('message', {});
});
return io;
};
但现在,我想在家用控制器上检索我的io服务器并调用特定的套接字。我试过这样做:
/controller/home.js
var io = require('../sockets.js');
module.exports = {
home: function(req, res, next) {
var socket = io.to(socket_id);
socket.emit('message', {});
}
};
但我有这个错误,因为我没有执行该功能(但我不想在这里创建一个新的套接字服务器):
TypeError: Object function (server) {
var io = socket.listen(server);
/*.....*/
return io;
} has no method 'to'
我希望能够访问app.js上调用的此函数返回的io变量。我怎么能得到它?
答案 0 :(得分:1)
您可以将sockets.js
转换为公开io
属性的对象。您还可以在初始化期间添加app.js调用的函数listen
。
// sockets.js
module.exports = {
listen: function(server) {
this.io = socket.listen(server);
//...
return this.io;
}
}
然后您的控制器可以访问require('../sockets.js').io
,您只需要确保在使用时定义了io
,或者确保app.js在您的控制器之前调用listen
被调用。
答案 1 :(得分:0)
您必须将sockets.js转换为公开io属性的对象。 您还可以在初始化期间添加一个函数侦听app.js调用。
您的控制器可以访问require('../ sockets.js')。io。