我正在尝试创建一个在模板中使用的辅助函数。
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
。
我应该如何以正确的方式创建此帮助器?
答案 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。