Функция Async и promise ничего не отображают в моем вызове res.json

#javascript #node.js #express

#javascript #node.js #выразить

Вопрос:

У меня есть контроллер в javascript, который должен получить данного пользователя, а затем домашних животных, которые связаны с пользователем. Связанные домашние животные хранятся в массиве ссылок на объекты в пользовательской схеме. В тот момент, когда я пытаюсь res.json результирующий массив, содержащий связанных домашних животных, он выводит как пустой массив ‘[]’. Следуя документам и руководствам Mozilla, я попытался реализовать обещание для этой функции, чтобы бороться с моей предыдущей проблемой с выводом пустого массива res.json. Я не уверен, где я ошибаюсь, так как я новичок в JS / express / node / mongo

Проблемный код:

      export const getPetsForAUser = (req, res)=>
    {
        function getter(){
            return new Promise(resolve =>{
           User.findOne({_id: req.params._id}, (err, users) =>{
               
                let petlist = users.pets;
                for(var i = 0; i < petlist.length; i  ){
            Pet.findOne({_id:petlist[i]}, (err, pet) =>{
                var t = pet
                   
                    return Promise.resolve(t)
                    
            });
        }
    })
       
                
                
        });
    
    
    }
    async function asyncCall(){
        const result = await getter();
        res.json(result);
    }
    
    asyncCall();
    
    };


 

Ответ №1:

Использование Aync / Await и обещание всего

 export default async (req, res) => {
const promises = [];
let result = null;

const petlist = await new Promise((resolve, reject) => {
    User.findOne({ _id: req.params._id }, (err, users) => {
        if (err) {
            reject(err);
        } else {
            resolve(users.pets);
        }
    });
});

if (petlist amp;amp; petlist.length) {
    for (let i = 0; i < petlist.length; i  ) {
        // eslint-disable-next-line no-loop-func
        const promise = new Promise((resolve, reject) => {
            Pet.findOne({ _id: petlist[i] }, (err, pet) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(pet);
                }
            });
        });
        promises.push(promise);
    }

    result = await Promise.all(promises).then((data) => {
        console.log('all promises resolved!');
        console.log(data);
        return data;
    });
}

console.log(result);

};
 

Комментарии:

1. Большое вам спасибо за вашу помощь! Я просто немного смущен тем, как я буду использовать асинхронный экспорт по умолчанию с моим исходным именем контроллера, поскольку «экспорт асинхронного по умолчанию getPetsForAUser = (req, res) =>», похоже, вызывает проблемы

2. Это было решено с помощью: export const getPetsForAUser = async(req, res) => {

3. Я получаю ‘undefined’ в результате console.log (результат), любые предложения о том, как заставить его отображать данные

4. забыл вернуть данные внутри pomise all, теперь я обновил приведенный выше код.

Ответ №2:

Вы можете реализовать подобные обещания в своем коде:

   export const getPetsForAUser = (req, res) => {
            return new Promise((resolve, reject) =>{
               
                User.findOne({_id: req.params._id}, (err, users) => {
                
                if (err) reject(err);
               
                let petlist = users.pets;

                for(var i = 0; i < petlist.length; i  ) {

                         Pet.findOne({_id:petlist[i]}, (err, pet) =>{
                         if (err) reject(err);
                         var t = pet
                         resolve(t)
                    
            });
        }
    })