У меня есть контроллер в 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
digit23 11 Фев 2021 в 19:37

2 ответа

Лучший ответ

Использование Async / Await и Promise all

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 && 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
Ashok Kumar 12 Фев 2021 в 14:46

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

  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)
                    
            });
        }
    })    
            
1
Apoorva Chikara 11 Фев 2021 в 18:13
66158874