時代はもうJavaScriptの時代です!笑。
Node.jsでサーバーサイドを実装するプロダクションも増えていると実感しています。
その中、定番の組み合わせでよく登場する Node.js+Express.js+Mongoose+MongoDBがありますよね!
MongooseとMongoDBの組み合わせが大変便利で
開発の効率向上に貢献しています!
しかし、よくある「Callback地獄」がやはり、ありました!
例えば、データを全件一覧を取得するAPIエンドポイントがあるとします。
indexという関数を呼び出すと、mongoDBからその一覧を出します。(もちろんいくつか条件で絞ってもいいです。)
#javascript 勉強中の皆さん!
せっかくなので
どうせなら
合わせて #reactjs #ReactNative も一緒にやっちゃうのが絶対おすすめだ!
規模問わずウェブサービスも作れるようになるし
iOSアプリもAndroidアプリも作れるようになるし#Nodejs でサーバー側の応用も書けます!
今すぐ行動する人RT!— 川島@ソフトウェア、Web、アプリ、IoT作るのが大好き (@kokensha_tech) 2018年8月3日
目次
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ください!
async : 待ってくれや!
await : 待ってやる!— 川島@ソフトウェア、Web、アプリ、IoT作るのが大好き (@kokensha_tech) 2018年8月7日
確かに!これから避けるべき言語の中特にPHPとRubyは決して悪い言語だと思いませんが
でもどうせ今から勉強するなら
避けた方がいいかもしれません。
すでに習得済み組はそのまま
またまた全然活躍すると思います。 https://t.co/863EaOsG3i— 川島@ソフトウェア、Web、アプリ、IoT作るのが大好き (@kokensha_tech) 2018年7月30日
[amazonjs asin=”4797383585″ locale=”JP” title=”確かな力が身につくJavaScript「超」入門 (確かな力が身につく「超」入門シリーズ)”]
[amazonjs asin=”B07DR76HSG” locale=”JP” title=”スラスラ読める JavaScriptふりがなプログラミング”]