【问题标题】:Returning JSON via node.js response.write has unexpected results通过 node.js response.write 返回 JSON 有意外结果
【发布时间】:2012-02-08 22:21:12
【问题描述】:

这是一个sn-p:

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 objects 是我通过 node-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"}]

我一定是做错了什么……

【问题讨论】:

  • 你能举一个对象被序列化的例子吗?
  • 我编辑了我的问题以包含更多细节,并希望能解决您的评论。另外,我最初(错误地)说我只看到了 first 对象,而实际上我只看到了 last 一个。
  • 您的异步代码错误。 if (i === keys.length) 行将始终返回 true,因为您正在检查 client.hgetall 是否已被调用 keys.length 次,而不是调用是否已完成。你应该检查(objects.length === keys.length)
  • 感谢@DeaDEnD。改变这个确实有效,所以如果你想把它作为答案,我会使用它。这种异步的东西对我来说有点新鲜,所以我的想法不在那个车道上。再次感谢!
  • 我不喜欢coffeescript。

标签: json node.js stringify


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多