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