从异步

时间:2017-09-23 17:29:00

标签: node.js mongodb express mongoose

写一个助手来获得两个用户的友谊,看看他们是否已经确认了他们的友谊,或者是否有待处理或其他什么。

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

1 个答案:

答案 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,因为它不涉及当前用户。