私はPassport、Nodemailer、Sequelize、およびExpressを使用して、電子メールでアプリに申し込んだユーザーアカウントの確認を処理しています。 不正な結果を返すfindAllクエリを続行
この機能をテストするために、私はサインアップして、Nodemailerを使用して、指定Mailinatorアドレスに(ユーザーの電子メールと一意に決定された確認コードを含むクエリ文字列と一緒に)電子メールを送信するために Mailinatorアカウントを使用しています。 Nodemailerで電子メールを開き、確認リンクをクリックすると、データベースの確認フラグが更新され、ユーザーが確認されます。このプロセスは、電子メールでサインアップしているユーザーの1人だけに当てはまります。 2人目のユーザーがサインアップすると、以前と同じようにクエリ文字列にユーザー名と固有の確認コードが付いた確認メールが送信されますが、今回は複数のユーザーがユーザーから返されます。 findAll
リンクをクリックすると、Sequelizeでクエリが実行されます。私のクエリはfindAll
個のメールアドレスと認証コードの一致が考えられます(各ユーザーは1つのメールアドレスでのみサインインでき、認証コードは一意です)。何らかの理由でそのクエリからすべての一致が返されます。 validateUserAccount()関数で
/* 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(<[email protected]>);
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);
});
}
コンソール文は私が({username: <emailAddress>, activationCode: <uniqueCode>})
を期待すると、クエリが正確であることを明らかにした。ここで
findAll
クエリが実行された後の最初の行で行われたconsole.logステートメントは、すべてのユーザーがクエリから返されていることを示しています。WHEREクエリが正しく渡されると不可能になります。ログされたステートメント。なぜユーザーですか。
findAll
私のクエリから間違った結果が返されますか?
'findAll()'の代わりに 'Model.findOne()'を使用して 'LIMIT 1'を追加し、単一の結果を返すことをお勧めします。 – doublesharp