Node.js中的双重mongodb请求

时间:2018-08-28 12:14:04

标签: node.js mongodb

嗨,我的应用程式中有两个要求 但是只有一个发送结果,我该怎么做才能使它们都起作用? 第一个是我所有建筑物的获取,第二个是相同的获取,但是我按校园名称对整个文档进行了排序。

我确实喜欢那样,但是仍然无法正常发送一个请求。

app.get('/buildings', async (req, res) => {
    try {
        await db.db('').collection('buildings').find({}).toArray(function (err, result) {
            res.send(result);
    });
        await db.db('').collection('buildings').aggregate([
        {$group : {_id: "$campusName", buildings : {$push : {buildingName : "$buildingName", phoneNumber :"$phoneNumber" }}}}
        ]).toArray(function (err, building) {
            res.send(building);
    });        
        } catch(err) {
            return res.json({
                         success: false,
                         message: 'error'
    });
        }
    });

这是我的新查询

app.get('/buildings', async (req, res) => {
    try {
        await db.db('').collection('buildings').find({}).toArray(async (err, result) => {


        await db.db('').collection('buildings').aggregate([
        {$group : {_id: "$campusName", buildings : {$push : {buildingName : "$buildingName", phoneNumber :"$phoneNumber" }}}}
        ]).toArray((err, building) => {
            res.send(result);
            res.send(building);
        });  
    });      
        } catch(err) {
            return res.json({
                         success: false,
                         message: 'error'
    });
        }
    });

最后,我所做的就是将两个查询分成两个这样的地址,对于我来说,最好在前端处理和操作

app.get('/buildings', async (req, res) => {
    try{
        await db.db('').collection('buildings').find({}).toArray(function (err, result) {
            res.send(result);
    });
        } catch(err) {
        return res.json({
                     success: false,
                     message: 'error'
                 });
        }
    });

app.get('/buildings/percampus', async (req, res) => {
    try {
        await db.db('').collection('buildings').aggregate([
        {$group : {_id: "$campusName", buildings : {$push : {buildingName : "$buildingName", phoneNumber :"$phoneNumber" }}}}
      ]).toArray(function (err, building) {
            res.send(building);
    });
        } catch(err) {
        return res.json({
                     success: false,
                     message: 'error'
                 }); 
        }

    });

2 个答案:

答案 0 :(得分:0)

您(AFAIK)不能在一条路线上有多个.get处理程序。您可以将多个中间件链接到一条路由上,但是不能使用多个处理程序,因为只有第一个处理程序将被执行。这意味着您应该在单个请求中获得多个响应,而这不是它的工作方式,实际上会破坏您的Express,因为内部处理得当。如果您希望返回多件事情,请在一个处理程序中运行两个查询:

app.get('/buildings', async (req, res) => {
    let res_obj = {}
    // Then execute your queries, and place the results inside this res_obj 
    ... queries and their handling ...
    res.send(res_obj);

理想情况下,哪个会返回

{
    first_query_res: {
        ... 
    },
    second_query_res: {
        ... 
    }
}

答案 1 :(得分:0)

您必须发送包含所需值(建筑物和结果)的单个响应。
首先,我们将从db中搜索并获取result和building的值,然后我们创建一个对象{building:'',result:''}},然后将其打包(JSON.stringify),然后作为响应发送。

app.get('/buildings', async (req, res) => {
    try {
        await db.db('').collection('buildings').find({}).toArray(function (err, result) { // second db search in this
        await db.db('').collection('buildings').aggregate([
        {$group : {_id: "$campusName", buildings : {$push : {buildingName : "$buildingName", phoneNumber :"$phoneNumber" }}}}
        ]).toArray(function (err, building) {
            //res.send({building:building,result:result}); 
            // or
            res.send(JSON.stringify{building:building,result:result});

    });        
        } catch(err) {
            return res.json({
                         success: false,
                         message: 'error'
    });
        }
    });