如何解决Nodejs Express - res.send(<a very long string>) 在将结果发送回客户端时冻结
我是 JS 和 Node 的新手。我昨天才开始学习,所以我可能没有以正确的方式做事。
我有一个 NodeJS 应用程序,我使用 express 建立了一个服务器。客户端将向此服务器发出获取请求,服务器将执行一些 API 调用/计算,然后当结果准备好时,服务器将结果发送回客户端。这就是我现在拥有的
app.mjs
app.get('/log',function (req,res) {
...
function callback(data) {
res.send(data);
}
deviceHandler.getLog(filteredDevices,callback);
}
)
和 deviceHander.mjs
class DeviceHandler {
...
getLog(device,callback) {
var handler = this.deviceHandlers[device.type]
handler.getLog(device,callback)
}
}
其中一个设备是 iPhone,所以这里是 iphoneDeviceHandler.mjs 的一个片段
IphoneDeviceHandler.prototype.getLog = function(device,callback) {
get(url,callback);
};
最后是我的get函数
function get(url,callback,method='GET') {
var http = new XMLHttpRequest();
http.open(method,url,true);
...
http.onload = function() {
if (http.status != 200) {
callback(`Error ${http.status}: ${http.statusText}`);
} else { // show the result
// callback(http.responseText) <--- this freeze
console.log(Buffer.byteLength(http.responseText,"utf-8")); <-----1323196 bytes so 1.3 MB but sometimes it can be up to 5MB
}
};
http.send();
}
这有效,但我认为我做错了什么,因为我的终端在我打一个电话后一直冻结所有内容。以下是问题
- 在我向本地主机服务器发出请求后,终端冻结。不确定为什么,但我怀疑这与我的回调函数有关?它在我添加回调后开始。
- 获取日志操作需要一段时间,这就是我使用同步调用
http.open(method,false);
的原因。那样可以么?我听说同步在 JS 世界中普遍不受欢迎? (我再次对它非常陌生)还是应该执行异步操作,但是如何在 app.mjs 中调用 res.send() 之前将响应返回给客户端? - 推荐的返回进度的方法是什么?
解决方法
您应该设置响应状态,如果需要,您还可以设置 cookie 和标题
res.status(200).json({ data })
,从上面的代码片段中,我看到您在 foreach 循环中使用回调的地方。根据我的经验,我能理解的是你应该在整个过程结束后调用回调,
此外,您在回调中使用 res.send(),并且该回调是循环的一部分。 (如果您传递一个设备,则可以,但是对于多个设备,它将多次运行 res.send()) 如果您运行 res.send() 一次,那么客户端将不会收到未来的 res.send() 因为连接将从两端关闭。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。