Node Express Trouble возвращает объект для просмотра из запроса

Я пытаюсь:

  1. Передайте идентификатор пользователя в запрос модели, который должен вернуть запись пользователя из монго.
  2. Отнесите этот объект пользователю к моему представлению, чтобы я мог использовать его поля.

Я не совсем уверен, что происходит не так - функция запроса находит правильного пользователя, и я могу console.dir видеть все поля. Когда я пытаюсь вернуть его на мой взгляд с res.render, я ничего не получаю:

Здесь мой маршрут:

app.get('/account', function(req, res) {
 res.render('account', {title: 'Your Account', username: req.user.name, user:account.check(req.user.id) }); 
});

И моя функция запроса:

exports.check = function(userId) { 
MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
if(err) throw err;
var collection = db.collection('test'); 
collection.findOne({userId : userId}, function(err, user) {
if (err) throw err; 
console.log("account.check logging found user to console: ");
console.dir(user); 
return user;

 });
 }); 
}

Опять же, это показывает правильную запись

Наконец, мое мнение:

<h2>Account Page</h2>

<p>Why, Hello, there <b> {{username}} </b> </p>

<p>You came from {{user.provider}}</p>

<p>{{user.lastConnected}}</p>

<a href="https://qa-help.ru/" target="_blank">Go Home</a> ~ <a href="logout" target="_blank">Log Out</a>

Любой из них будет оценен по достоинству!

1 ответ

Функция findOne MongoDB является асинхронной (в качестве аргумента требуется обратный вызов). Это означает, что ваша функция проверки также должна быть асинхронной и принимать обратный вызов в качестве аргумента (или возвращать обещание).

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

app.get('/account', function(req, res) {

 account.check(req.user.id, function(error, user) {
 if (error) {
 // do something smart like res.status(500).end()
 return;
 }
 res.render('account', {title: 'Your Account', username: req.user.name, user:user }); 
 }

});

И функция проверки должна быть примерно такой:

exports.check = function(userId, callback) { 
 MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
 if(err) {
 callback(err);
 }

 var collection = db.collection('test'); 
 collection.findOne({userId : userId}, function(err, user) {
 if(err) {
 callback(err);
 }

 console.log("account.check logging found user to console: ");
 console.dir(user); 

 callback(null, user);
 });
 }); 
}

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

licensed under cc by-sa 3.0 with attribution.