我想使用此代码在同一客户端(并非所有客户端)中发送数据;
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,它会工作,我可以用其他任何方式做这个场景吗?
答案 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;
}
}
}