我如何将mongo查询的返回值传递给Express模板

时间:2019-10-30 17:14:04

标签: node.js mongodb express ejs

我正在尝试创建一个在模板中使用的辅助函数。

var User = require("../models/user");
var ObjectId = require('mongodb').ObjectID;

function retrieveUser(id, callback) {
    User.find(ObjectId(id), {image: 1, _id: 0}, function(err, users) {
      if (err) {
        callback(err, null);
      } else {
        callback(null, users[0]);
      }
    }).lean();
  };
function getUserImage(id){
    user_image = null;
    retrieveUser(id, function(err, user) {
        if (err) {
            console.log(err);
        }
        console.log(user.image);
        user_image = user.image
        // do something with user
    });
  return user_image;
}

module.exports.getUserImage = getUserImage;

我在console.log中看到正确的值,但是,当我称它为

<%=getUserImage("5d999578aeb073247de4bd6e")%>

例如,

home.ejs是给我undefined

我应该如何以正确的方式创建此帮助器?

1 个答案:

答案 0 :(得分:1)

之所以会这样,是因为retrieveUser是一个异步函数,因此return user_image语句不会等待retrieveUser完成。您可以使用此函数的同步版本(如果存在),或者应首先调用并收集user_image,然后再调用render函数并将其传递给路由中的render函数。我认为,考虑到JavaScript的异步特性,第二种方法是编写方法。

您可以编写中间件,使其看起来像这样-

    (req, res, next) => {
     retrieveUser(<ID>, function(err, user) {
        if (err) {
            console.log(err);
        }
        res.render('view_name', { image: user.image });
    });
}

这只是一个伪代码,您可以根据需要在代码中使用此概念。请记住,必须在回调函数中调用render。