我有一个NodeJS代码,基本上就是这样:
HTTP请求(app.get) - >向低级别套接字发送请求(使用net.Socket()) - >从socket获取响应 - > res.send(来自套接字的响应)
这不起作用,因为net.Socket()使用异步函数和事件(Realm database
)。
我试过这样的事情:
client.on("data", callback)
但它不起作用,因为它说我正在重新发送标题(res对象不会因为函数是事件而不是同步函数而改变)。
有什么想法吗?还是用于同步套接字请求的库?我尝试过以下方法:
他们没有工作。
编辑:我正在尝试这样的事情:
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);
});
});
答案 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 });
});