Sails js,使用电子邮件或用户名查找用户

Sails js,find user using either email or username

我正在尝试使用用户名或电子邮件登录用户,即用户可以输入电子邮件或密码,并且应该能够登录。但是,到目前为止,我可以使用其中之一。

这是到目前为止尝试过的代码。

authenticate: function (req, res) {
    var username =  req.body.username;
    var email = req.body.email;
    users.findOne({ 
            or: [
                {username: username},
                {email: email}
            ]
    }).exec(function(err, user) {
        console.log(user);
        if (err) {
            return res.json({err});
        } else if (!user) {
            var err = new Error('User not found.');
            err.status = 401;
            return res.json({err});
        } else {
            require('bcrypt').compare(req.body.password, user.password, function(err, result) {
                if(result === true) {
                    return res.json({user});
                } else {
                    return res.json({err});
                }
            });
        }
    });
}

虽然 sails waterline 不如直接访问任何一个数据库那么强大,但它可以在这里做你想做的事情等等。 docs 给出了一些很好的例子来说明什么是可能的。

我不知道你是如何将用户名或电子邮件传递给你的请求对象的,但这样的事情应该有效:

authenticate: function(req, res) {
    var username = req.param('username'); // or however you get this
    var email = req.param('email'); // or however you get this
    Users.findOne({
        or: [{username: username}, {email: email}]
    }).exec(function(err, user) {
        // handle the error, or make use of found user...
    });
}

您还可以处理用户向您提供的输入可能是用户名或电子邮件的情况...

var identifier = req.param('identifier'); // could be a username or an email

然后将您的 or 数组修改为:

or: [{username: identifer}, {email: identifier}]

如果你使用action 2风格,你可以做到 ```

var identifier = inputs.identifier;
    var userRecord = await User.findOne({
      or : [{username: identifier}, {email: identifier}]
    });