2012-01-12 3 views
0

Вот отрывок:Возвращаясь JSON с помощью Node.js Response.Write имеет неожиданные результаты

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(); 
    } 
    } 
} 

Значение переменной объекты представляет собой массив объектов я заполнить с помощью запроса 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"}] 

я должен делать что-то не так ...

+0

Можете ли вы привести пример сериализации объекта? –

+0

Я отредактировал мой вопрос, чтобы включить более подробную информацию и, надеюсь, обратиться к вашему комментарию. Кроме того, я изначально (неправильно) заявил, что я видел только объект * first *, когда на самом деле я получаю только * последний *. – CircusNinja

+0

Ваш асинхронный код неверен. Строка 'if (i === keys.length)' всегда будет возвращать true, потому что вы проверяете, был ли 'client.hgetall' назван' keys.length' раз, а не если вызовы завершены. Вместо этого вы должны проверить '(objects.length === keys.length)' – fent

ответ

1

Ваш код асинхронной неправильно. Строка if (i === keys.length) всегда будет возвращать true, потому что вы проверяете, был ли client.hgetall вызван key.length раз, а не если вызовы завершены. Вместо этого вы должны проверять (objects.length === keys.length) - DeaDEnD