我正在使用nodeJS和socket io构建应用程序。 我有一个server.js文件,其中我执行了以下操作:
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
io.on('connection', function(socket){
console.log("a user is connected");
});
我还有另一个文件“api.js”,其中我有以下功能:
filter.watch(function(error, result){
if (!error){
var newblock = new Block(web3.eth.getBlock(result));
newblock.save(function (err) {
if (err) return handleError(err);
// saved!
})
}
});
我试图将文件api.js中的对象“newblock”(不断变化)发送到带有socket io的server.js。我尝试在api.js中执行“socket.emit('fromApi_toserver',newblock)”,但它不起作用......有没有人有任何想法?
答案 0 :(得分:1)
这里似乎有几个问题。
首先,如果您要发送给所有已连接的客户端,那么您将使用io.emit()
,而不是socket.emit()
。
其次,由于io
文件中定义了app.js
,如果您希望在api.js
文件中访问它,则需要专门使其可用于该文件。有很多方法可以做到这一点,但最常见的是在加载api.js
模块时使用模块构造函数将其传递给该文件。这是一种方法:
app.js
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
io.on('connection', function(socket){
console.log("a user is connected");
});
// pass io variable to app.js when loaded
require('api.js')(io);
api.js
// define module constructor
let io;
modules.exports = function(socketio) {
// save io instance for later use
io = socketio;
}
filter.watch(function(error, result){
if (!error){
var newblock = new Block(web3.eth.getBlock(result));
newblock.save(function (err) {
if (err) return handleError(err);
// send JSON stringified version of newblock to all connected clients
io.emit(newblock);
});
}
});
第三,您无法向客户端发送实时对象。在发送到客户端之前,socket.io的数据被序列化为JSON字符串,然后客户端socket.io将JSON反序列化为对象。但是,它只是客户端上的普通对象,而不是任何特定的对象类型。如果您需要将数据作为特定对象类型(例如客户端Block对象),则必须获取所接收的数据并使用它来创建自己的新客户端Block对象。
第四,你的问题是关于第二个套接字,但你不需要另一个套接字。您可以使用io
实例通过io.emit()
发送给所有当前连接的客户。