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

Sequelize findAll query returning incorrect results

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

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

这个过程正如我所期望的那样适用于一个通过电子邮件注册的用户。当第二个用户注册时,像以前一样发送验证邮件,在查询字符串中包含用户名和唯一验证码,但是这次,多个用户从用户返回。findAll 通过 Sequelize 查询时link 被点击。我的查询旨在 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 从我的查询返回不正确的结果?

这里的问题是您正在使用 querystring.parse()

的 return 值

如 Node 文档中所述:

Note: The object returned by the querystring.parse() method does not prototypically extend from the JavaScript Object. This means that the typical Object methods such as obj.toString(), obj.hasOwnProperty(), and others are not defined and will not work.

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

此外,正如@doublesharp 提到的,您可能希望获取一行并对其进行验证,而不是 findAll 对行进行过滤然后进行过滤。此外,您应该利用回调。您现在正在编写阻塞代码。