从asynchronous返回mongoose聚合值

写一个帮手,以获得两个用户的友谊,看他们是否已经确认了他们的友谊,或者是否正在等待或者其他什么。

结果[0] .friends [0] .status返回0,1或2。

例如。

[{id:59974d2915a07e09b88e3b4b,status:1,_id:59974d9015a07e09b88e3b53}]

我正在使用下面的帮助器方法来尝试获得该值工作正常,但我似乎无法设置它。

UserSchema.methods.getRelationship = function getRelationship(username, userid, callback) { var relationship = 0; User.aggregate([ { $match: { username: username, 'friends.id': userid } }, { $project: { friends: { $filter: { input: '$friends', as: 'fr', cond: { $eq: ['$$fr.id', userid] } } } } } ], function (err, result) { if (err) { console.log(err); return; } if (result.length >= 1) { relationship = result[0].friends[0].status; } } ); return relationship; } 

 user.getRelationship(req.params.username, req.session.user.id) 

返回undefined。 为什么?

更新的代码

 app.get('/:username', requireLogin, function(req, res, next) { var relationship = 0; user.getRelationship(req.params.username, req.session.user.id, function(err, r) { // r should be 1 relationship = r; }); res.render("user", { data: user, relationship: relationship, layout: 'user' }) } }) 

})

关系被传递回(handlebars)视图为0

因为您正在进行asynchronous调用 – 您不能从asynchronous调用return

你可以做的是在你的方法中传递一个callback – 你已经完成了。 除非你没有打电话 一旦从内部callback中获得结果,请调用主callback。

 UserSchema.methods.getRelationship = function (username, userid, callback) { var relationship = 0; User.aggregate([ // ... ], function (err, result) { if (err) return callback(err); if (result.length) relationship = result[0].friends[0].status; callback(null, relationship); }); }); 

你会使用它

 user.getRelationship(req.params.username, req.session.user.id, function (err, relationship) { console.log(err, relationship); res.render(/* ... */); }); 

另外,这个函数看起来更好,因为它不涉及当前用户。