NodeJS,MongoDB-从GET请求中的聚合返回JSON响应

问题描述 投票:0回答:2

[我创建了一个聚合管道,该管道可以从数据库中返回许多文档。我也可以使用“ 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] :将标头发送到客户端后无法设置标头

node.js mongodb aggregate response middleware
2个回答
0
投票

您需要调用.toArray()方法以返回所有结果。

尝试一下:

cursor.toArray((error, result) => {
    if(error) {
        return res.status(500).send(error);
    }
    res.send(result);
});

尝试其他:

collection.aggregate([{}], (err, docs) => {
    res.json(docs)
})

0
投票

请尝试这个:

/* 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;
© www.soinside.com 2019 - 2024. All rights reserved.