写一个助手来获得两个用户的友谊,看看他们是否已经确认了他们的友谊,或者是否有待处理或其他什么。
result [0] .friends [0] .status返回0,1或2。
例如。
[{id:59974d2915a07e09b88e3b4b, 状态: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'
})
}
})
})
关系被传递回(车把)视图为0
答案 0 :(得分:2)
因为您正在进行异步调用 - 您无法通过异步调用来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(/* ... */);
});
然后你会用它
{{1}}
除此之外,此功能看起来更好static,因为它不涉及当前用户。