Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Async和promise函数在我的res.json调用中不显示任何内容_Javascript_Node.js_Express - Fatal编程技术网

Javascript Async和promise函数在我的res.json调用中不显示任何内容

Javascript Async和promise函数在我的res.json调用中不显示任何内容,javascript,node.js,express,Javascript,Node.js,Express,我有一个javascript中的控制器,它应该得到一个给定的用户,然后是与该用户关联的宠物。相关的PET存储在用户架构中的对象引用数组中。此时,当我尝试res.json包含相关pets的结果数组时,它输出为空数组“[]”。在Mozilla文档和教程之后,我尝试实现一个关于这个函数的承诺,以解决我之前的res.json输出空数组的问题。我不确定我会错在哪里,因为我是JS/express/node/mongo的新手 问题代码: export const getPetsForAUser=(请求、恢复)

我有一个javascript中的控制器,它应该得到一个给定的用户,然后是与该用户关联的宠物。相关的PET存储在用户架构中的对象引用数组中。此时,当我尝试res.json包含相关pets的结果数组时,它输出为空数组“[]”。在Mozilla文档和教程之后,我尝试实现一个关于这个函数的承诺,以解决我之前的res.json输出空数组的问题。我不确定我会错在哪里,因为我是JS/express/node/mongo的新手

问题代码:

export const getPetsForAUser=(请求、恢复)=>
{
函数getter(){
返回新承诺(解决=>{
User.findOne({u id:req.params.\u id},(err,users)=>{
让petlist=users.pets;
对于(var i=0;i{
var t=pet
返回承诺。解决(t)
});
}
})
});
}
异步函数asyncCall(){
const result=await getter();
res.json(结果);
}
异步调用();
};

您可以在代码中实现这样的承诺:

  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)
                    
            });
        }
    })    
            
export const getPetsForAUser=(请求、恢复)=>{
返回新承诺((解决、拒绝)=>{
User.findOne({u id:req.params.\u id},(err,users)=>{
如果(错误)拒绝(错误);
让petlist=users.pets;
对于(var i=0;i{
如果(错误)拒绝(错误);
var t=pet
解决(t)
});
}
})    

使用Aync/等待并承诺所有

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);

};
导出默认异步(req,res)=>{
常量承诺=[];
设result=null;
const petlist=等待新承诺((解决、拒绝)=>{
User.findOne({u id:req.params.\u id},(err,users)=>{
如果(错误){
拒绝(错误);
}否则{
解析(users.pets);
}
});
});
if(petlist&&petlist.length){
for(设i=0;i{
Pet.findOne({{u id:petlist[i]},(err,Pet)=>{
如果(错误){
拒绝(错误);
}否则{
决心(宠物);
}
});
});
承诺。推动(承诺);
}
结果=等待承诺。所有(承诺)。然后((数据)=>{
console.log('所有承诺已解决!');
控制台日志(数据);
返回数据;
});
}
控制台日志(结果);
};

非常感谢您的帮助!对于如何将导出默认异步与我的原始控制器名称一起使用,我只是有点困惑,因为“导出默认异步GetPetsFrauser=(req,res)=>”似乎会导致问题解决,使用:export const GetPetsFrauser=async(req,res)=>{我得到“undefined”作为console.log的结果(结果),关于如何让它显示数据的任何建议都忘记了返回pomise中的数据,我现在已经更新了上面的代码。