Ответ 1
В экспресс-3 вы можете напрямую использовать res.json({foo: bar})
res.json({ msgId: msg.fileName })
См. документацию
Используя nodejs и express, я хотел бы вернуть один или несколько объектов (массив) с помощью JSON. В приведенном ниже коде я выдаю один объект JSON за раз. Это работает, но это не совсем то, что я хочу. Полученный ответ не является допустимым ответом JSON, так как у меня много объектов.
Мне хорошо известно, что я могу просто добавить все объекты в массив и вернуть этот конкретный массив в res.end. Однако я боюсь, что это может стать тяжелым для процесса и интенсивной памяти.
Каков правильный способ добиться этого с помощью nodejs? Является ли query.each правильным методом для вызова?
app.get('/users/:email/messages/unread', function(req, res, next) {
var query = MessageInfo
.find({ $and: [ { 'email': req.params.email }, { 'hasBeenRead': false } ] });
res.writeHead(200, { 'Content-Type': 'application/json' });
query.each(function(err, msg) {
if (msg) {
res.write(JSON.stringify({ msgId: msg.fileName }));
} else {
res.end();
}
});
});
В экспресс-3 вы можете напрямую использовать res.json({foo: bar})
res.json({ msgId: msg.fileName })
См. документацию
Я не знаю, действительно ли это по-другому, но вместо того, чтобы перебирать курсор, вы можете сделать что-то вроде этого:
query.exec(function (err, results){
if (err) res.writeHead(500, err.message)
else if (!results.length) res.writeHead(404);
else {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(JSON.stringify(results.map(function (msg){ return {msgId: msg.fileName}; })));
}
res.end();
});
[Изменить] После просмотра документации Mongoose, вы можете отправить каждый результат запроса в виде отдельного фрагмента; веб-сервер использует закодированную кодировку передачи по умолчанию, так что все, что вы нужно сделать, это обернуть массив вокруг элементов, чтобы сделать его допустимым объектом 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.
});
В качестве альтернативы, как вы упомянули, вы можете просто отправить содержимое массива as-is. В этом случае тело ответа будет буферизировано и отправлено немедленно, что может потреблять большой объем дополнительной памяти (выше того, что требуется для хранения результатов сами) для больших наборов результатов. Например:
// ...
var query = MessageInfo.find(/*...*/);
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(query.map(function(x){ return x.fileName })));