Nodejs等待套接字然后响应http请求

时间:2018-06-04 12:37:18

标签: javascript node.js sockets express asynchronous

我有一个NodeJS代码,基本上就是这样:

HTTP请求(app.get) - >向低级别套接字发送请求(使用net.Socket()) - >从socket获取响应 - > res.send(来自套接字的响应)

这不起作用,因为net.Socket()使用异步函数和事件(Realm database)。

我试过这样的事情:

client.on("data", callback)

但它不起作用,因为它说我正在重新发送标题(res对象不会因为函数是事件而不是同步函数而改变)。

有什么想法吗?还是用于同步套接字请求的库?我尝试过以下方法:

  • Synket
  • 同步插座
  • netlinkwrapper

他们没有工作。

编辑:我正在尝试这样的事情:

app.get("/", function(req, res){
   client.connect("localhost", 420, function(){
      client.write("example data");
   });
   client.on("data", function(data){
       client.destroy();
       res.send(data);
});
});

我第一次尝试访问该页面时有效,但第二次应用程序崩溃时出现此错误:

async function sendData(client, res){
  client.on('data', function(data){
    console.log("Got data!");
    res.send(""+data);
    res.end();
    console.log("Sent data!");
    client.destroy();
    console.log("Killed connection");
    return;
  });
}

app.get("/", function(req, res){
   var body = req.query;

client.connect(420, "localhost", function(){
      client.write("some random data");
      console.log("Connected & Data sent!");
      sendData(client, res);
   });
});

2 个答案:

答案 0 :(得分:0)

client多次触发data事件。

`app.get("/", function(req, res){
   client.connect("localhost", 420, function(){
      client.write("example data");
   });
   client.pipe(res);
});
});
`

答案 1 :(得分:0)

事实证明,每次请求到达该端点时,都会通过调用client.on('eventName', cb)来注册新的订阅。因此,从第二个开始的调用将触发这些注册的倍数,并将导致该标头错误。

因此,一种解决方法:

socket.on('event', (packet) => {
    socket.removeAllListeners('event')
    res.json({ packet });
});

这可以解决问题,但我不确定连续添加/删除同一事件是否是个坏习惯。

修改

找到了更好的方法。 once将确保注册的事件只运行一次,就像我们想要的那样:

socket.once('event', (packet) => {
    res.json({ packet });
});