2017-10-22 12 views
0
router.post('/', (req, res) => { 
    // req.body = [1,2,3,4,5] (these are player ids) 
    function createGame() { 
     return knex.insert({'gameDate': new Date(), 'season_id': 1}) 
      .into('game') // creates new game with new id 
      .returning('id') // return that new game id 
     } 
     .then(game_Id => { 
      function createPlayerGameRow(game_id, req.body) { // req refer above 
       req.body.forEach(id => { 
        return knex.insert({ 'player_id': id, 'game_id': game_id }) 
        .into('player_game') 
       }) 
      } 
     }) 
}) 

このセクションでは、最初のクエリcreateGame()がゲームテーブルに新しいゲームを作成するクエリを分離する必要があります。これは正常に動作します。Knexクエリで複数の行を挿入する

私は、最初の約束事で別のクエリ(createPlayerGameRow())をチェーンしようとして問題が発生しています。

この関数はidの配列を実行してループしますが、再生1,2,3,4,5がいくつかの統計情報を記録できることを示すために、新しい行を自分のplayer_gameテーブルに挿入しません。

私は遠くに見て、これを理解するのに運がなかった。私はplayer_gameテーブルへの挿入をループすることで何か間違ったことをしているに違いありません。

+0

の配列上にマッピングされた私は、これを確認していないが、それは「}」の後に、次に呼び出すためにOKですか? !?? これを行う正しい方法は、チェーンコールを.returning(id)に追加することです。 –

+0

promise文のようにしてください。それがなければ、ロジックは本質的に非同期です。 – simplyketchup

+0

返却までの呼び出しをチェーンしても問題は解決しないのですか?私はJSの専門家ではなく、私はあなたの答えを理解していないが、私はそれが解決すると思う –

答えて

0

はそれを考え出した:)Promise.allを(使用する必要がするとidの

router.post('/', (req, res) => { 
    let player_ids = req.body.players 
    queries.createGame() 
    .then(game_id => { 
     return Promise.all(player_ids.map(player_id => { 
     return Promise.resolve(queries.createPlayerGame(game_id[0], player_id)) 
     })) 
     .then(elem => { 
     res.json({msgInside: elem}) 
     }) 
    }) 
    .catch(err => { 
     res.json({msgErr: err}) 
    }) 
}) 
関連する問題