状況説明
私は現在、簡単なTODOアプリケーションをNode.jsで作成しようとしているのですが、同期処理の実装に困ってしまい、長い時間解決に至らなかったために相談させていただきました。
今実装したいこととしては、タスクのIDをあるURLにPOSTすると、そのタスク情報をMongoDBから取得してJSON形式で返すというAPIを実装したいと思っています。ですが、Node.jsのモジュール群は非同期の関数で実装されているとのことで、思った挙動が得られない状態です。
同期処理についていくらか調べてみて、Promiseという概念が用いられることとasync/awaitで実装されるとよいということまでは理解したのですが、それを踏まえて自分なりに実装してみてもうまく動かないようでした。動かない要因等をお教えいただけると非常に嬉しいです。
問題のコード
以下がルーティングの部分です。/task/getoneにtaskId付きでPOSTすることを想定しています。この状態だと、ret
が空のままres.json(ret)
が実行されて、空のbody.dataでレスポンスが返ってきます。
自分なりに考えてasync/awaitを追加してみたのですが、思うように動きません。
Node.js
1var GetOneTask = require('../controller/task/getOneTask.js'); 2 3---(中略)--- 4 5router.post('/task/getone', async function (req, res, next) { 6 console.log(req.body); 7 var body = req.body; 8 var ret; 9 if (body.taskId==null){ 10 ret = { 11 state: 'failure', 12 description: 'Task Id is empty.' 13 }; 14 } else { 15 ret = await GetOneTask(body.taskId); 16 } 17 res.json(ret); 18 })
以下はDB操作をする関数です。上のコードでrequireされます。
async関数にしてみていますが、思うような挙動は得られませんでした。
module.exports = async function (taskId) { // モデルの宣言 var Task = require('../../model/Task'); Task.findById(taskId, function(err, result){ if (err) { console.log(err) return { state: 'failure', description: 'Find Error' } } else return { state: 'success', data: result } }) }
実行結果
body.dataにデータを付与してレスポンスとして返したいのですが、空っぽのまま200番が返ってしまいます。
聞きたいこと
- これではなぜ動かないか
- どのようにすれば期待通りの同期処理が得られるか
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/16 13:02