socket.emit问题进入post方法

时间:2015-03-04 22:49:53

标签: node.js sockets

我想使用此代码在同一客户端(并非所有客户端)中发送数据;

    app.post("/search", function(req, res) {
    //some other codes
    //if database saved {
    io.sockets.emit('preview-post', {title: "blabla" });// io variable was declared as GLOBAL
    // } database saved end.
res.send({bla:bla});// response end before database saving process
    });

此示例正在运行!但它发送给所有客户端,我如何向同一个打开的浏览器(同一客户端)发送数据?

第二个问题是:有没有其他方法可以做到这种情况? 我的算法是post方法触发>异步调用api>在客户端加载的响应结束和页面>对api的异步调用仍在继续>如果异步呼叫完成>向客户发送提醒。但是怎么样?我想用socket .io来做,如果我使用你的3.part,它会工作,我可以用其他任何方式做这个场景吗?

1 个答案:

答案 0 :(得分:1)

这确实发送到所有套接字。

有几种方法可以实现您的目标。第一种方法是在服务器上执行类似的操作:

io.on('connection', function(socket) {
  socket.on('search', function(*/ client supplied arguments /*){
    socket.emit('preview-post', {title: "blabla" });
  });
});

如果您坚持使用发布请求,然后将其发送回客户端,有两种方法可以实现此目的。

最简单的方法,如果您只需要响应此响应,只需从节点发送标准响应,并让客户端处理它:

res.send({
  event: 'preview-post',
  payload: {title: "blabla" }
});

这将删除socket.io的事件系统,因此如果您坚持使用socket.io将此事件发送回同一客户端,则需要使用cookie。 Express和模块cookie-parser让您轻松上手。

完成此设置后,您可以在请求中执行以下操作:

app.post("/search", function(req, res) {
  var socket = findSocketByCookie(req.cookies.myUniqueCookie);
  socket.emit('preview-post', {title: "blabla" });
});

function findSocketByCookie(cookie) {
  for(var i in io.sockets.connected) {
    var socket = io.sockets.connected[i];
    if(socket.handshake.headers.cookie.indexOf(cookie) !== -1){
      return socket;
    }
  }
}