Двойной запрос mongodb в nodejs - PullRequest
0 голосов
/ 28 августа 2018

Привет, у меня есть два запроса в моем приложении. но только один отправить результат, как я могу сделать, чтобы они оба работали? первый - это все мои здания, второй - тот же самый, но я сортирую весь документ по campusName.

Я так и сделал, но все еще не работает, только один отправленный запрос.

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 голосов
/ 28 августа 2018

Вы должны отправить один ответ с необходимыми значениями, зданием и результатами.
Сначала мы будем искать в 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'
    });
        }
    });
0 голосов
/ 28 августа 2018

Вы не можете (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: {
        ... 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...