nodejs express - 大块在 res.on('data') 中记录两次
nodejs express - big chunk is logged twice in res.on('data')
据我所知,我在 nodeJS 中遇到了异步问题,但我无法处理它,也没有找到解决我的特定问题的方法。
我目前正在实现一个服务器,该服务器每 x 秒轮询一次来自另一台服务器的数据。然后我使用外部服务器响应的数据块(一个 JSON 字符串)来接收必要的实时数据,然后解析并将它们保存到我的 mongoDB。
问题是块有时很长,因为服务器有时会传输很多行。
因此,有时只要块不是太大,我的工具就可以工作,但有时却不行。记录块后,我注意到在这些情况下,块被记录了两次。
例如,如果 res.data
看起来像这样:[1,"123"][9,"234"](实际上它当然要大得多)我会记录:
块:[1,”123
块 "][9,"234"]
这会破坏我的 var response
,然后是 response: "][9,"234"]
。
这是代码的重要部分:
function pollUra() {
var response = '';
var deferred = Q.defer();
// Send a request to URAv2
var req = http.request(options, function (res) {
res.setEncoding('utf-8');
res.on('data', function (chunk) {
// We need to set response to null here, because if there is too many data in the chunk,
// the response concatenates chunk after chunk, while chunk is concatenated by its seperate parts.
// chunk1 -> chunk1+chunk2 -> chunk1+chunk2+chunk3
// response = chunk1 -> chunk1+chunk1+chunk2 -> chunk1+chunk1+chunk2+chunk1+chunk2+chunk3...
console.log('chunk: '+chunk);
response = '';
response += chunk;
});
res.on('end', function () {
var parsedResponseArray = parser.parseQuery(response);
...
}
我认为评论中描述的 soulition 解决了这个问题,因为它似乎大部分时间都有效,但现在看来这只是运气,块没有变得足够大以致失败时间更长。
我的愿望是在数据块完全发送后才捕获它,但不知何故我找不到解决方案,因为我认为 res.on('end')
只是在数据块完全发送后才被调用。
我错过了什么?
提前致谢!
删除 res.on('data'...
中的 response = '';
行
否则代码看起来不错,问题是您重新初始化了 response
变量。因此,每次新数据到达时,先前保存的数据块都会被删除。
引用你的话:
For example if the res.data looks like this: [1,"123"][9,"234"] (in
real it is of course much bigger) I get logged:
chunk: [1,"123 chunk "][9,"234"]
注意块 1 + 块 2 = [1,"123"][9,"234"]
因此,代码必须是您拥有的代码,但不重置 response
变量:
// Send a request to URAv2
var req = http.request(options, function (res) {
res.setEncoding('utf-8');
response = ''; // Reset variable in case it is not empty
res.on('data', function (chunk) {
// We need to set response to null here, because if there is too many data in the chunk,
// the response concatenates chunk after chunk, while chunk is concatenated by its seperate parts.
// chunk1 -> chunk1+chunk2 -> chunk1+chunk2+chunk3
// response = chunk1 -> chunk1+chunk1+chunk2 -> chunk1+chunk1+chunk2+chunk1+chunk2+chunk3...
console.log('chunk: '+chunk);
response += chunk;
});
res.on('end', function () {
var parsedResponseArray = parser.parseQuery(response);
...
}
据我所知,我在 nodeJS 中遇到了异步问题,但我无法处理它,也没有找到解决我的特定问题的方法。
我目前正在实现一个服务器,该服务器每 x 秒轮询一次来自另一台服务器的数据。然后我使用外部服务器响应的数据块(一个 JSON 字符串)来接收必要的实时数据,然后解析并将它们保存到我的 mongoDB。 问题是块有时很长,因为服务器有时会传输很多行。
因此,有时只要块不是太大,我的工具就可以工作,但有时却不行。记录块后,我注意到在这些情况下,块被记录了两次。
例如,如果 res.data
看起来像这样:[1,"123"][9,"234"](实际上它当然要大得多)我会记录:
块:[1,”123 块 "][9,"234"]
这会破坏我的 var response
,然后是 response: "][9,"234"]
。
这是代码的重要部分:
function pollUra() {
var response = '';
var deferred = Q.defer();
// Send a request to URAv2
var req = http.request(options, function (res) {
res.setEncoding('utf-8');
res.on('data', function (chunk) {
// We need to set response to null here, because if there is too many data in the chunk,
// the response concatenates chunk after chunk, while chunk is concatenated by its seperate parts.
// chunk1 -> chunk1+chunk2 -> chunk1+chunk2+chunk3
// response = chunk1 -> chunk1+chunk1+chunk2 -> chunk1+chunk1+chunk2+chunk1+chunk2+chunk3...
console.log('chunk: '+chunk);
response = '';
response += chunk;
});
res.on('end', function () {
var parsedResponseArray = parser.parseQuery(response);
...
}
我认为评论中描述的 soulition 解决了这个问题,因为它似乎大部分时间都有效,但现在看来这只是运气,块没有变得足够大以致失败时间更长。
我的愿望是在数据块完全发送后才捕获它,但不知何故我找不到解决方案,因为我认为 res.on('end')
只是在数据块完全发送后才被调用。
我错过了什么?
提前致谢!
删除 res.on('data'...
response = '';
行
否则代码看起来不错,问题是您重新初始化了 response
变量。因此,每次新数据到达时,先前保存的数据块都会被删除。
引用你的话:
For example if the res.data looks like this: [1,"123"][9,"234"] (in real it is of course much bigger) I get logged:
chunk: [1,"123 chunk "][9,"234"]
注意块 1 + 块 2 = [1,"123"][9,"234"]
因此,代码必须是您拥有的代码,但不重置 response
变量:
// Send a request to URAv2
var req = http.request(options, function (res) {
res.setEncoding('utf-8');
response = ''; // Reset variable in case it is not empty
res.on('data', function (chunk) {
// We need to set response to null here, because if there is too many data in the chunk,
// the response concatenates chunk after chunk, while chunk is concatenated by its seperate parts.
// chunk1 -> chunk1+chunk2 -> chunk1+chunk2+chunk3
// response = chunk1 -> chunk1+chunk1+chunk2 -> chunk1+chunk1+chunk2+chunk1+chunk2+chunk3...
console.log('chunk: '+chunk);
response += chunk;
});
res.on('end', function () {
var parsedResponseArray = parser.parseQuery(response);
...
}