[我创建了一个聚合管道,该管道可以从数据库中返回许多文档。我也可以使用“ console.log”查看结果。但是当我使用Postman时,无法在响应中返回结果。
/* Frameworks Used + constants */
var express = require('express');
var router = express.Router();
var assert = require('assert')
const URL = 'an Atlas MongoDB'
const MongoClient = require('mongodb').MongoClient
router.get('/base/:param1/:param2/:param3', (req, res, next) => {
MongoClient.connect(URL,
(err, client) => {
assert.equal(null, err)
const db = client.db('DB')
var collection = db.collection('Collection')
var cursor = collection.aggregate([{
/* ... an aggregate with: $lookup,$unwind,$match,$addFields,$project ..... */
])
cursor.forEach(doc => {
console.log(doc)
})
})
})
module.exports = router;
我可以看到“ cursor.forEach(doc => {console.log(doc)})“在终端中,这似乎工作正常。我要问的是如何在json中返回响应。诸如“ res.json(cursor)之类的东西,我尝试了一些不同的函数/方法来做到这一点,但没有似乎有效。
更新回答后,我尝试了此
cursor.toArray((error, result) => {
if(error) {
return res.status(500).send(error);
}
cursor.forEach(doc => {
res.send(doc)
})
});
上面的代码在用Postman测试时从数据库返回了1个json文档。问题是它只返回了一个json文件,然后服务器崩溃了。我要返回的文档是多个。错误消息是错误[ERR_HTTP_HEADERS_SENT] :将标头发送到客户端后无法设置标头
您需要调用.toArray()方法以返回所有结果。
尝试一下:
cursor.toArray((error, result) => {
if(error) {
return res.status(500).send(error);
}
res.send(result);
});
尝试其他:
collection.aggregate([{}], (err, docs) => {
res.json(docs)
})
请尝试这个:
/* Frameworks Used + constants */
var express = require('express');
var router = express.Router();
var assert = require('assert')
const URL = 'an Atlas MongoDB'
const MongoClient = require('mongodb').MongoClient
router.get('/base/:param1/:param2/:param3', async (req, res, next) => {
try {
await MongoClient.connect(URL,
(err, client) => {
assert.equal(null, err)
const db = client.db('DB')
let resp = db.collection('Collection').aggregate([{
/* ... an aggregate with: $lookup,$unwind,$match,$addFields,$project ..... */
}]).toArray();
res.json(resp)
})
} catch (error) {
console.error('Error ::', error)
//res.status(400).end(); (Or)
res.send({ error: error.message });
}
})
module.exports = router;