是否可以在服务器端打开两个插槽

时间:2017-04-17 00:04:59

标签: node.js sockets socket.io

我正在使用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)”,但它不起作用......有没有人有任何想法?

1 个答案:

答案 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()发送给所有当前连接的客户。