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