我在nodeJS中遇到了一个问题,据我所知,这是异步,但我无法处理它,而且我找不到解决我特定问题的方法。
我目前正在实施一个服务器,每x秒轮询来自另一台服务器的数据。然后,我使用外部服务器响应的数据块(即JSON字符串)来接收必要的实时数据,然后解析并将它们保存到我的mongoDB中。 问题是,由于服务器有时传输许多行,因此块有时很长。
因此,有时我的工具已经可以在块不是太大的情况下工作,但有时它不会。记录块之后,我注意到在这些情况下,块会被记录两次。
例如,如果res.data
看起来像这样:[1," 123"] [9," 234"](实际上它当然要大得多)我得到了记录:
chunk:[1," 123 chunk"] [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);
...
}
我认为评论中描述的灵魂解决了这个问题,因为它似乎在大部分时间都有效,但现在似乎只是运气才能使大块没有变得足够大更长的时间。
我的愿望就是在完全发送之后抓住这个块但我无法找到解决方案,因为我认为res.on('end')
只是在数据块完全被发送后才被调用。
我错过了什么?
提前致谢!
答案 0 :(得分:3)
删除response = '';
res.on('data'...
否则代码看起来不错,问题是你重新初始化response
变量。因此,每次新到达时,先前保存的数据块都会被删除。
引述你:
例如,如果res.data看起来像这样:[1," 123"] [9," 234"](in 真的,它当然要大得多)我得到了记录:
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);
...
}