从函数返回mongojs查询结果
我做了下面的函数来从ID获取用户名。它运作不好。 我可以编写console.log(result.first_name);在查询功能中,用户名显示在我的终端中,但不是浏览器。我试着在函数的末尾添加“返回”一些东西,以查看浏览器是否显示出来 - 它的确如此。如何编写函数以便返回查询结果?从函数返回mongojs查询结果
功能(在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;})
好吧,我找到了解决办法。不确定它是否有用,但是有效。不需要功能。
页处理程序(在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}
没有因为JavaScript的异步特性。我在代码中添加了一些注释以指示执行的实际顺序。这就是你遇到错误的原因。
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);
});
};
我知道了,谢谢。所以我应该以不同的方式来解决这个问题? – Frode 2012-04-24 09:59:50
看编辑只是作出 – deltanovember 2012-04-24 10:03:53
我得到这个:“错误:TypeError:undefined不是一个函数” – Frode 2012-04-24 10:23:09
您可以将您的响应封装在闭包中以使其更易于测试。然后将闭包作为回调传递给查询 - 这样您就可以用模拟或其他不需要HTTP的东西替代它。看到我对我自己的类似问题的答复在http://*.com/questions/11972763/how-to-use-events-keep-mongodb-logic-out-of-node-js-request-handlers – fijiaaron 2012-08-27 16:01:34
这似乎是一个非常冒险的解决方案。我认为这会比重复嵌套的mongojs查询更直观。 – 2017-06-22 17:43:46