Sequelize findAll查询返回不正确的结果

时间:2017-01-27 19:39:06

标签: mysql sql express sequelize.js nodemailer

我正在使用 Passport,Nodemailer,Sequelize和Express 来处理已通过电子邮件注册到应用的用户帐户的验证。

要测试此功能,我使用 Mailinator 帐户进行注册,并将电子邮件(以及包含用户电子邮件和唯一确定的验证码的查询字符串)发送到指定的Mailinator地址使用Nodemailer。然后,我在Nodemailer中打开电子邮件,单击验证链接,更新数据库中的验证标志并验证用户。

此过程适用于我通过电子邮件注册的用户。当第二个用户注册时,验证电子邮件将像以前一样使用查询字符串中的用户名和唯一验证码发送,但这次,用户通过Sequelize查询多个用户。findAll单击链接。我的查询旨在findAll电子邮件地址和验证码的可能匹配(因为每个用户只能使用一个电子邮件地址登录,验证码是唯一的),但由于某种原因,查询返回所有匹配项查询。

以下是一些供参考的代码:

/* Sending the emails */

emails.sendActivationEmail = function(user){
    const qso = {username: user.username, activationCode: user.activationCode};
    const qs = querystring.stringify(qso);
    const from = new helper.Email(<myEmailAddress@email.com>);
    const to = new helper.Email(user.username);
    const subject = 'Welcome to My Site!';
    const content = new helper.Content('text/html', "<p> Thanks for signing up " +
    "for our psych study, please <a href=\"http://localhost:7000/users/validate/account?" + 
     qs + "\">confirm your email</a></p>");

    const mail = new helper.Mail(from, subject, to, content);

    sendMail(mail); //invokes SendGrid mail helper function
}

/* Function invoked when user clicks on verification link in email */

emails.validateUserAccount = function(req, res){
    const url = parseUrl(req.url);
    const query = querystring.parse(url.query);

    db.User.findAll({where: query}).then(function(matches){
        if(matches.length !== 1){
            res.send('error: multiple users found');
        }
        else{
            db.User.update({
                isVerified : true
            }, 
            {
                where: {
                    username: matches[0].username
                }
            });
            req.session.user = matches[0];
            res.redirect('/');
        }
    }).catch(function(err){
       console.error(err);
       res.send(err);
    });
}

validateUserAccount()函数中的控制台语句显示查询完全符合我的预期({username: <emailAddress>, activationCode: <uniqueCode>})。但是,执行findAll查询后在第一行中生成的console.log语句显示所有用户都是从查询中返回的,如果正确传递WHERE查询,这应该是不可能的,这看起来像它来自记录的陈述。为什么User。findAll会从我的查询中返回错误的结果?

1 个答案:

答案 0 :(得分:1)

此处的问题是您使用的是querystring.parse()

的返回值

如节点文档中所述:

  

注意:querystring.parse()方法返回的对象不是从JavaScript对象原型扩展的。这意味着obj.toString(),obj.hasOwnProperty()等典型的Object方法没有定义,也不起作用。

where子句可能需要一个实际的JS对象。

此外,正如@doublesharp所提到的,你可能想要获取一行并验证它,而不是findAll行然后过滤。此外,您应该利用回调。你现在正在编写阻止代码。