Как запустить запрос Mongoose для каждого результата, чтобы объединить данные? - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу знать, понравилась ли пользователю книга и отобразить сердце в зависимости от состояния (понравилось / не понравилось) в результатах на мой взгляд.

Проблема в том, что значение из второго запросанедоступен за пределами этой функции.

Я попытался использовать внутреннюю асинхронную функцию, но это не дает результата.Я также попытался добавить книги в массив и вернуть, что это дает пустой массив.

var bookQuery = Book.find({ title: req.body.title}, {}, { skip: 0, limit: 200 })
.sort({ name: 1 });

bookQuery.lean().exec(function (err, books) {
  books = books.map(function (book) {
    Like.findOne({ object: book._id, likedby: req.session.passport.user }).exec(function (err, like) {
      book.liked = (like != null) ? 1 : 0;
      // Here it's available
    });

    return book;
  });

  cb(books);
}, cb);

Я хочу добавить поле для каждой книги со значением из запроса Like.Прямо сейчас отображаются только книги.

1 Ответ

0 голосов
/ 25 декабря 2018

Так как вы знаете, что многие вещи асинхронны в Node JS, вы не можете получить результат извне функции обратного вызова.Для обратных вызовов вы можете просто использовать модуль async , чтобы избежать вызовов обратного вызова .Модуль async очень популярен среди разработчиков Node JS, поэтому, если вы используете обратные вызовы, я настоятельно рекомендую использовать async .Он имеет десятки методов, которые облегчают и процветают ваш код.

Тем не менее, с ES6 поставляется много новых и полезных функций.Одной из этих функций является Promise .Он разработан на основе обратных вызовов и позволяет легко кодировать асинхронные функции.Существует также один простой способ преодоления асинхронных функций: async / await .На самом деле, есть функции генератора .

...