サイトアイコン KOKENSHAの技術ブログ

node.js+express.jsサーバーのmongooseで、async/awaitを使えるようにする!簡単確実!

時代はもうJavaScriptの時代です!笑。

Node.jsでサーバーサイドを実装するプロダクションも増えていると実感しています。

その中、定番の組み合わせでよく登場する Node.js+Express.js+Mongoose+MongoDBがありますよね!

MongooseとMongoDBの組み合わせが大変便利で

開発の効率向上に貢献しています!

しかし、よくある「Callback地獄」がやはり、ありました!

例えば、データを全件一覧を取得するAPIエンドポイントがあるとします。

indexという関数を呼び出すと、mongoDBからその一覧を出します。(もちろんいくつか条件で絞ってもいいです。)

目次

Before

//あなたのデータ 全件一覧取得
//
//データ一覧のリクエストにデータ一覧を返す処理
exports.index = function (req, res) {
  logger.trace('Data データ一覧');
  DataSchema
      //すべての列を出す(論理削除されていないもの)
      .find({
        deleted_flag: false
      })
      // 日付最新順
      .sort({
        created_date: -1,
      })
      //
      .exec(function (err, users) {
        if (err) {
          logger.trace('Data データ一覧、取得時エラー', err)
          //別のエラーハンドリング処理、ここで無視してください。
          return handleError(res, err);
        }
        //ここで、データを取得できる
        logger.trace('Data result', result);
        return res.status(200).json({
          result: data
        });
      })

};

これでも、別に、問題なく、データを取得して、処理することができますが

しかし、複数の「テーブル」collectionからデータを所得して

そのデータを比較したり、いろんな演算処理をしていくと

だんだんインデントが増えて、Callbackが増えて、コードの可読性が著しく低下してしまいます。

他人はともかく、三日間後、自分でさら、読めなくなることになるでしょう!笑。

なので、そこで、asyncとawaitがあるじゃないか!

今回は

簡単確実に!

node.js+express.jsサーバーのmongooseで、async/awaitを使えるようにする方法をご紹介します!

早速、適用した後のコードをご覧ください!

After

//
//新しく作った非同期関数、あなたのデータ 全件一覧取得
async function _asyncData(req) {
  logger.trace('asyncData データ一覧');
  try {
    const result = await DataSchema
      //すべての列を出す(論理削除されていないもの)
      .find({
        deleted_flag: false
      })
      // 日付最新順
      .sort({
        created_date: -1,
      })
      //
      .exec()
    logger.trace('asyncData result', result);
    return result
  } catch (err) {
    logger.trace('asyncData データ一覧、取得時エラー', err)
    //別のエラーハンドリング処理、ここで無視してください。
    return handleError(res, err);
  }
}
//データ一覧のリクエストにデータ一覧を返す処理
exports.index = async function (req, res) {
  var data = await _asyncData(req)
  return res.status(200).json({
    result: data
  });

};

indexの部分がとてもシンプルになったことがお分かりになったでしょうか。

こうすることで、複数の「テーブル」を見ても、Callbackではなく、順次に処理していくイメージでコードをかけます!

例えば、こんな感じで

//データ一覧のリクエストにデータ一覧を返す処理
exports.index = async function (req, res) {
  var data = await _asyncData(req)
  var user = await _asyncUserData(req)
  var money = await _asyncMoneyData(req)
  var review = await _asyncReviewData(req)
 
  for(....){
    // use data, user, money, review
    //ここで何かの処理をする、データが確実に到着してから、実行することが保証されています!
  }
  result=処理結果
  return res.status(200).json({
    result: result
  });

};

複数のデータを取ってくるのも、普通に書けますね!

重要!

node.jsのバージョン

Node.js V7.6からasync/awaitが正式に使えるようになりました。

exec()

.exec()

ここで、必ず、exec()を使ってください。

promiseを返すのがexec()なので、これを使わないと、うまくいきません。

(こちらも合わせて、ご参考ください! http://mongoosejs.com/docs/promises.html)

エラー処理

また、必ず、try, catchのブロックに入れてください。

そうすると、エラーもちゃんとキャッチできるようになります!

では、御機嫌よう! Happy Coding!

最後に

意見交換や、絡みなどぜひ Twitterでお願いします!DMください!

 

[amazonjs asin=”4797383585″ locale=”JP” title=”確かな力が身につくJavaScript「超」入門 (確かな力が身につく「超」入門シリーズ)”]

[amazonjs asin=”B07DR76HSG” locale=”JP” title=”スラスラ読める JavaScriptふりがなプログラミング”]

モバイルバージョンを終了