Синхронные запросы для заполнения объекта - PullRequest
0 голосов
/ 26 июня 2018

У меня есть проект, который использует Restify, Node.js и MongoDB. Это небольшой проект для тестирования Restify, где у меня есть несколько статей с комментариями к ним.

Я на самом деле пытаюсь создать маршрут, который берет заголовок статьи и возвращает все статьи с одинаковыми именами (некоторые статьи имеют одно и то же имя) и связывает с ними комментарии.

Итак, в общем, я сделал это:

server.get('/articles/title/:title', (req, res, next) => {
    Article.find({'title': req.params.title}, (err,articles) => {
        if(err) {
            return next(new errors.InvalidContentError(err.errors.name.message));
        }
        for(var i=0;i<articles.length;i++) {
            Comment.find({'article': articles[i]._id}, (err, comments) => {
                articles[i]["link"] = comments;
            });
        }
        res.send(articles);
        next();
    });
});

Но этот код не работает, потому что Comment.find является асинхронным.

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

Ответы [ 2 ]

0 голосов
/ 26 июня 2018
db.yourparent_table.aggregate([
// to split each of array element
{ "$unwind": "$your_children_field" },

{ "$lookup": {
   "from": "yourparent_table",
   "localField": "your_children_field",
   "foreignField": "_id",
   "as": "comments"
}},

])

0 голосов
/ 26 июня 2018

вы делаете это неправильно, если вы используете библиотеку "mongoose", вы можете использовать метод populate(), чтобы оставлять комментарии и публиковать их вместе, посмотрите эту документацию мангуста

если вы выполняете необработанный запрос монго, вам нужно использовать $lookup агрегацию $ посмотреть документацию

Ваши подходящие посты и комментарии могут быть эффективно получены всеми вышеуказанными способами.

...