NodeJs Пн goose: невозможно получить данные рецептов вне forEach l oop, даже если они отображаются во время итерации внутри цикла - PullRequest
0 голосов
/ 15 марта 2020

Я запрашиваю данные категории через mon goose, собираю массив food_ids, перебираю каждый Id и нахожу его в другой коллекции под названием Recipes, где я собираю еще некоторые данные. В каждой итерации я помещаю его в массив. В конце я пытаюсь отправить этот массив объектов как JSON. Однако все, что я получаю, это пустой вывод. Во время итерации, когда я консоль журнала данных, все выглядит правильно. Я также консоль зарегистрировал один и тот же массив дважды, один раз в forEach и один раз снаружи, и заметил, что один внешний выполняется первым, что не имеет смысла для меня. Это потому, что findById является асин c вызовом? И если это так, как я мог тогда управлять этим потоком, чтобы внешний массив имел данные. Ниже весь мой код для конечной точки:

const express = require('express');
const router = express.Router();
const Category = require('../models/category');
const Recipe = require('../models/recipe');

/**
 Endpoint: /category/:id
 Outcome: List of recipes belonging to category
 */

 router.get('/:id', (req, res) => {

    Category.findById(req.params.id, 'mealIds', (err, category) => {
        const recipesReceived = [];
        if(!err) {
            if(category) {

                category.mealIds.forEach(mealId => {
                    Recipe.findById(mealId, 'name category cuisine image' , (err, recipe) => {
                        recipesReceived.push(recipe);
                        console.log(recipesReceived); //shows data
                    });
                });
                console.log(recipesReceived); //shows blank. somehow ends up executing before the console log within forEach condition
            }
        else {
            console.error(err);
        }
    }
  });
 });
 module.exports = router;

1 Ответ

0 голосов
/ 15 марта 2020

попробуйте

  category.mealIds.forEach(async (mealId) => {
                let recipe=await  Recipe.findById(mealId, 'name category cuisine image')
                if(recipe)recipesReceived.push(recipe);

            });
            console.log(recipesReceived);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...