通过node.js response.write返回JSON会产生意外结果



下面是一个片段:

objects = [];
client.keys 'objects*', (err,keys) ->
for (i = 0; i < keys.length; i++){
  client.hgetall(keys[i], function(err, obj) {
    objects.push(obj);
    if (i === keys.length){
      response.writeHead(200, {'Content-Type': 'application/json'});
      console.log(JSON.stringify(objects));
      response.write(JSON.stringify(objects));
      response.end();
    }
  }
}

var对象是我通过节点redis查询redis填充的对象数组,每个对象有6个属性。在控制台中,我得到了我所期望的。然而,在客户端中,我会收到一个只包含最后一个对象的数组。我想知道它是否是客户端的解相关器,于是在Fiddler中捕捉到了它,它仍然是那个带有单个对象的数组。

以下是我通过console.log在控制台中获得的内容:

[{"prop1":"11","prop2":"12","prop3":"13","prop4":"14","prop5":"15","prop6":"16"},  {"prop1":"21","prop2":"22","prop3":"23","prop4":"24","prop5":"25","prop6":"26"},{"prop1":"31","prop2":"32","prop3":"33","prop4":"34","prop5":"35","prop6":"36"},{"prop1":"41","prop2":"42","prop3":"43","prop4":"44","prop5":"45","prop6":"46"},{"prop1":"51","prop2":"52","prop3":"53","prop4":"54","prop5":"55","prop6":"56"},{"prop1":"61","prop2":"62","prop3":"63","prop4":"64","prop5":"65","prop6":"66"}]

我一定做错了什么。。。

您的异步代码是错误的。if(i===keys.length)行将始终返回true,因为您正在检查client.hgetall是否已被调用keys.length次,而不是调用是否已完成。您应该检查(objects.length==keys.length)–DeaDEnD

最新更新