2017-02-02 14 views
0

私はノードを使い慣れておらず、すべての約束事とpg-promiseを学んでいます。新しいユーザーを作成見つからない場合は、チェックのユーザー名を見つけていない場合 約束を使ってステートメントを連鎖させる方法

    1. チェック電子メール:これは私がExpressとPG-約束を使って何をしたいのかです。
    2. 戻りユーザID偉大な作業をされたSQLを実行し

    私は私のレポは(db.users)を設定持っています。

    私の認証ハンドラでは、どのようにrepo呼び出しを行うか分かりません。構文は私にとっては厄介なようです。これまで私が持っていたものは次のとおりです:

    exports.signup = function(req, res, next) { 
    
    const username = req.body.username; 
    const email = req.body.email; 
    const password = req.body.password; 
    
    // See if a user with the given email exists 
        db.users.byEmail({email: email}) 
         .then(user => { 
         if (user) { 
         return res.status(422).send({ error: 'Email is in use'}); 
         } else { 
         return null; <-- must I return something here? 
         } 
         }) 
        .then(() => { 
        db.users.getUsername({username: username}) 
        .then(user => { 
         if (user) { 
         return res.status(422).send({ error: 'Email is in use'}); 
         } else { 
         return null; <-- must I return something here? 
         } 
    
         ...etc 
    
        }) 
    

    多分、pg-promisesはこのように連鎖しませんか?彼らはお互いに入れ子になっているのか、まったく別のブロックになっているのでしょうか?また、キャッチがどこに行くのかは不明です。私は、さまざまなチュートリアルの後に私が考えることができるあらゆる方法を試しましたが、「設定済みのヘッダーを設定できません」や「約束が返されていません」といったエラーが発生します。どんな親切な人でも私をここで案内できるなら、本当に感謝しています。

  • 答えて

    0

    vitaly-tからの指針では、私は自分の答えを変えて、失敗したことに応じて別々のエラーメッセージを追加しました。私はまた、トランザクションブロックに次の "then"を移動し、ユーザーを作成する次のステップにトランザクションの "t"を使用しました。 vitaly-tには大変感謝しています!

    db.task(t => { 
        return t.users.byEmail({email}) 
         .then(user => { 
          if (user) { 
          throw new Error('Email is in use'); 
          } else { 
          return t.users.byUsername({username}); 
         } 
         }) 
         .then((user) => { 
          if (user) { 
           throw new Error('Username is taken'); 
          } else { 
           return t.users.addNew({username, email, password}); 
          } 
         }) 
    }) 
    .then(user => { 
        res.json({token: tokenForUser(user), username: user.username, aCheck: user.is_admin}); 
    }) 
    .catch(error => { 
        res.status(422).json({ 'error': error.message}); 
    }); 
    
    -1

    usernameemailの存在が互いに独立しています。私はPromise.all()があなたの必要性に順応することを約束してくれると思っています。

    exports.signup = function (req, res, next) { 
        const username = req.body.username; 
        const email = req.body.email; 
        const password = req.body.password; 
    
        Promise.all([ 
        db.users.byEmail({ 
         email: email 
        }), 
        db.users.getUsername({ 
         username: username 
        }) 
        ]).then((results)=> { 
        if (results[0] || results[1]) { 
         return res.status(422).send({ 
         error: 'Email is in use' // same error msg as per your snippet 
         }); 
        } 
        // here, code for creating a new user 
        }); 
    
    }; 
    
    +0

    これはPG-promise'のドキュメントは決してしないために教えてくれる、まさに 'です:https://github.com/vitaly-t/pg-promise/wiki/Common-Mistakes#tasks-versus-rootdirect-クエリ。それが十分に悪いことではない場合、クエリは依存しているため、独立して実行することはできません。 –

    +0

    @ vitaly-tはい。あなたが正しいです。それを指摘してくれてありがとう。あなたをアップアップする – Sridhar

    1

    複数のクエリを実行するとき、彼らは一つの接続を共有することができ、または他の接続管理は、パフォーマンスの問題を被るようにするには、taskを使用する必要があります。

    db.task(t => { 
        return t.users.byEmail({email}) 
         .then(user => { 
          return user || t.users.getUsername({username}); 
         }); 
    }) 
        .then(user => { 
         if (user) { 
          res.status(422).send({error: 'Email is in use'}); 
         } else { 
          // do something else 
         } 
        }) 
        .catch(error => { 
         // process the error 
        }); 
    

    それはpg-promise-demoに示すように、あなたのリポジトリが設定されたと仮定、うまく動作します。

    前の2つの回答は本当に悪いアドバイスでしたが、pg-promiseはあなたがすべきことを完全に反対しています。 Tasks versus root/direct queriesを参照してください。

    複数の変更を行う場合は、通常、トランザクションを使用します(taskではなくtx)。

    +0

    私を助けていただきありがとうございます。これは参考になりますが、私には1つの質問があります。私はそれぞれの失敗に対して別々のエラーを返したいと思います。そのメールのレコードがある場合は、「メールは使用中です」と返信し、ユーザー名には別のエラーが表示されます。あなたのコードからわかるように、それは電子メールのエラーだけを返します。どうすればいい? – Coco

    関連する問題