2017-09-25 15 views
0

私は、データベースになり、ユーザのためのシンプルなAPIでNode.jsの非同期呼び出しの周りGETルートをトラブル理解の非同期が

を私の頭を取得し、トラブルのビットを持っていると思うと、コールバックでユーザー情報を返します。

しかし、私は呼び出しの認証トークンを受信し、ユーザー情報を返すためにデータベース内の対応する電子メールを見つける必要があるルートミドルウェアを持っています。

私は与えられたトークンによって電子メールを探し、電子メールアドレスを返す関数を作成しました。この問題は、(いくつかの調査をした後で)非同期呼び出しから情報を返して、まだ待っている情報を必要とするコードを実行しないようにするべきです。

データベースのルックアップを電子メールが必要なルートに移動する方法があります。これの欠点は、私には、これが大きなコードではない大きなコードを複製する必要がある他の場所があるということです...

私はデータベースの検索を同期させる必要がありますか?これも可能ですか?これはコードを複製することだけのように見えます。

また、電話をかけて送信するには、ユーザー側のメールをクライアント側に保存する必要がありますか?私はユーザー情報のクライアント側を保存しないようにしたいので、これはまた悪いようです。

私はすべてのソリューションが欠けていますか?

私はあなたの考えを聞いています!

私の状況の簡素化:あなたはユーザーPromises

router.route('/firstroute/:token') 
    .get(function (req, res) { 
     getEmail(req.params.token) 
      .then((email) => { 
       res.send({ email }); 
       // find and send back user info 
      }); 
    }) 

router.route('/someotherroute/:token') 
    .get(function (req, res) { 
     // I also need the email lookup here.. 
     getEmail(req.params.token) 
      .then((email) => { 
       res.send({ email }); 
      }); 
    }) 

var getEmail = function (token) { 
    // look in session database for email belonging to this token 
    return new Promise((resolve, reject) => { 
     User.findOne({ 'token': token }, function (err, session) { 
      // check for err 
      if (err) { 
       return reject(err); 
      } 
      resolve(session.email); 
     }); 

    }); 
} 

にあります

router.route('/firstroute/:token') 
    .get(function(req, res) { 
     var email = getEmail(req.params.token); 
     // find and send back user info 
    }) 

router.route('/someotherroute/:token') 
    .get(function(req, res) { 
     // I also need the email lookup here.. 
     var email = getEmail(req.params.token); 
    }) 

getEmail: function(token) { 
    // look in session database for email belonging to this token 
    User.findOne({'token': token}, function (err, session) { 
     // check for err 
     return session.email; 
    }); 
} 

答えて

関連する問題