如何使用Node.js返回复杂的JSON响应?

使用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文档之后,看起来您可以将每个查询结果作为单独的块进行发送; Web服务器在默认情况下使用分块传输编码 ,所以您只需要在项目周围包装一个数组,以使其成为有效的JSON对象。

大致(未经testing):

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