[Редактировать] После просмотра документации Mongoose вы можете отправить каждый результат запроса в виде отдельного чанка; веб-сервер использует кодировку chunked Transfer по умолчанию , поэтому все, что вам нужно сделать, это обернуть массив вокруг элементов, чтобы сделать его действительным объектом JSON.
Примерно (не проверено):
app.get('/users/:email/messages/unread', function(req, res, next) {
var firstItem=true, query=MessageInfo.find(/*...*/);
res.writeHead(200, {'Content-Type': 'application/json'});
query.each(function(docs) {
// Start the JSON array or separate the next element.
res.write(firstItem ? (firstItem=false,'[') : ',');
res.write(JSON.stringify({ msgId: msg.fileName }));
});
res.end(']'); // End the JSON array and response.
});
В качестве альтернативы, как вы упоминаете, вы можете просто отправить содержимое массива как есть. В этом случае тело ответа будет буферизовано и отправлено немедленно, что может потребовать большой объем дополнительной памяти (сверх того, что требуется для хранения результатов) для больших наборов результатов. Например:
// ...
var query = MessageInfo.find(/*...*/);
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(query.map(function(x){ return x.fileName })));