如何用多种条件做简单的mongoose findOne?

时间:2016-03-03 18:50:34

标签: node.js express mongoose find conditional-statements

如何在多个条件下执行此findOne查询?或者替代方法(最好是同样简单的方法)如果不可能......

User.findOne({ 'email': email }, function (err, user) {

        if (err) {
            request.session.flash = {
                type: "danger",
                message: "Failed to log you in, error occurred."
            };
            response.redirect("/snippet/");
        }

我试过了

User.findOne({ 'email': email, 'pwd': pwd }, function (err, user) {

User.findOne({ 'email': email $and 'pwd': pwd }, function (err, user) {

User.findOne({ 'email': email}, $and: {'pwd': pwd}, function (err, user) {

3 个答案:

答案 0 :(得分:3)

尝试使用mongoose promise系统(.exec())。 .findOne()内的query应该是单个对象。

User
    .findOne({email: email, pwd: pwd})
    .exec(function(err, user){
        ...
    });

Sidenote - 看起来这是用于验证用户登录。这可能是一个更好的策略,只查询电子邮件,然后尝试匹配密码,以提供更多深度的错误响应,而不是一揽子'无效登录'类型响应。

User
    .findOne({email: email}) //If not found, no user with that email exists
    .exec(function(err, user){
        var hashed_pwd = hashPassword(pwd);
        if(!hashed_pwd === user.pwd){
            //If they don't match, user entered wrong password
        }
        ...
    });

答案 1 :(得分:1)

User.findOne({ 'email': email, 'pwd': pwd }, function (err, user) {

这种语法是正确的。如果这不会返回任何结果,则表示您没有匹配任何记录。

我的猜测是,您的pwd字段已进行哈希/加密,并且您需要在pwd变量上运行相同的哈希/加密才能执行此操作findOne

答案 2 :(得分:0)

当mongoDB返回您的文档时,如果找不到Data,它将返回null。 您可以检查您的docs是否为空,然后使用其他页面进行响应。 另一方面,如果docs有数据,则在下一页进行响应。

if(docs)
    respond("your content");
else
  respond("error page incorrect credentials")

我犯了一个错误,认为它将创建一个异常err,但这并不是一个错误,它只是一个null数据。