узел / mongodb — как хранить результаты запросов

#javascript #node.js #mongodb #express #monk

#javascript #node.js #mongodb #выражать #монах

Вопрос:

Я использую Express.js и у меня есть этот простой маршрутизатор

 router.get('/', function(req, res) {
    var userlist;
    req.db.get("usercollection").find({},{})
        .success(function(docs){
            userlist = docs;
        });

    res.render('index', { title: 'Express' , userlist: userlist});
});
 

но ничего не попадает в список пользователей. Я знаю, что написание вышеизложенного как

 router.get('/', function(req, res) {
    req.db.get("usercollection").find({},{})
        .success(function(docs){
            res.render('index', { title: 'Express' , userlist: docs});
        });
});
 

будет работать, но я хотел бы знать, почему предыдущий не работает. Кроме того, что возвращает db.get(…).find()? Возвращает ли он то же самое, что и «docs» в более позднем коде?

Большое спасибо

Ответ №1:

Это потому, что req.db.get().find() является асинхронной функцией. «res.render» может происходить до назначения userlist= docs.

Комментарии:

1. Итак, как бы я поступил, если бы захотел отобразить несколько наборов коллекций?

2. Я вижу 2 варианта: создание большого запроса, который получает все необходимые вам документы, «организует» их на стороне сервера, а затем отправляет их для рендеринга, или вложение нескольких запросов. Я думаю, что второй вариант лучше.

3. Это кажется довольно сложным. Может быть, альтернативой было бы получать нужные мне запросы с помощью вызовов AJAX (например, restful api) при загрузке страницы?

4. Вы тоже можете это сделать. Однако, в зависимости от взаимосвязи между вашими коллекциями, вы можете делать такие вещи, как «заполнить» (в случае, если вы используете Mongoose), например.