2017-01-27 6 views
0

私は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私のクエリから間違った結果が返されますか?

+1

'findAll()'の代わりに 'Model.findOne()'を使用して 'LIMIT 1'を追加し、単一の結果を返すことをお勧めします。 – doublesharp

答えて

1

ここでの問題は、ノードのドキュメントに示されたようあなたがquerystring.parse()

の戻り値を使用していることである。

注:querystring.parse()メソッドによって返されるオブジェクトはprototypicallyありませんJavaScriptオブジェクトから拡張します。つまり、obj.toString()、obj.hasOwnProperty()などの一般的なObjectメソッドは定義されておらず、機能しません。

実際のJSオブジェクトは、おそらくwhere句になります。 とは対照的に@doublesharpが述べているように、1行を取り出して検証したい場合は、findAllと入力してからフィルタリングします。また、コールバックを活用する必要があります。あなたは現在ブロックコードを書いています。

+0

ドキュメントを見ると、あなたが正しい可能性が高いのですが、querystring.parse()を使用できない場合は、ユーザー名とactivationCodeをどのように抽出してクエリの新しいオブジェクトを作成するのですか? –

+0

それは公正です。 JSON.stringifyを構文解析の戻り値に使用してから、JSON.parseをオブジェクトに入れて、それを渡して、それが機能するかどうかを確認してください。もしそうでなければ、我々はそれを働かせる別の方法を見つけなければならないでしょう。 – steviejay

+0

次のコードはvalidateUserAccount()内で機能しました。var url = parseUrl(req.url); var parsedQs = querystring.parse(url.query); query = JSON.parse(JSON。stringify(parsedQs)); const code = query.activationCode; const name = query.username;次にfindAllの代わりにfindOneを使用してコードと名前をwhereクエリに直接配置しました。 –

関連する問題