从函数返回mongojs查询结果

我做了下面的函数从ID获取用户名。 它运作不好。 我可以编写console.log(result.first_name); 在查询function中,用户名显示在我的terminal,而不是浏览器。 我试着在函数的末尾添加“返回”一些东西,看看是否在浏览器中显示出来 – 它做到了。 我如何编写函数以便返回查询结果?

函数(app.js中的全局函数)

function usernameFromId(id, callback){ db.users.findOne({ _id: ObjectId(id.toString()) }, function(err, result) { var first_name = result.first_name; console.log(first_name); // names show up in the console… callback(first_name); }); }; 

页面处理程序(在app.js中)

 app.get('/books', function(req, res){ function timeSince(dato){ moment.lang('nb'); return moment(dato).fromNow(); }; db.books.find().sort({ added:-1 }, function(err, docs) { var books = docs; db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) { var activity = docs; res.render('books', { books: books, activity: activity, timeSince: timeSince, usernameFromId: usernameFromId }) }); }); }); 

模板(books.jade)

 - each a in activity p=usernameFromId(a.user_id, function(name){return name;}) 

没有,因为JavaScript的asynchronous性质。 我已经添加了一些注释到您的代码,以指示执行的实际顺序。 这就是为什么你得到错误。

 function usernameFromId(id){ var id = id.toString(); // 1 db.users.findOne({ _id: ObjectId(id) }, function(err, result) { var first_name = result.first_name; // 3 }); return first_name; // 2 }; 

编辑:你可能想要像下面的东西

 function usernameFromId(id, callback){ var id = id.toString(); db.users.findOne({ _id: ObjectId(id) }, function(err, result) { var first_name = result.first_name; callback(first_name); }); }; 

好的,我find了一个解决scheme。 不知道是否有什么好处,但它的工作原理。 不需要function。

页面处理程序(在app.js中):

 app.get('/books', function(req, res){ db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) { var activity = docs; db.users.find(function(err, docs) { var users = docs; res.render('books', { page_title:'books', activity: activity, users: users }) }); }); }); 

模板(books.jade):

 - each a in activity - for u in users - if (a.user_id == u._id.toString()) | #{u.first_name}