【问题标题】:Insert multiple rows with Knex query使用 Knex 查询插入多行
【发布时间】:2017-10-24 10:11:30
【问题描述】:
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() 在我的游戏表中创建一个新游戏。这很好用。

我在尝试将另一个查询 (createPlayerGameRow()) 链接到第一个查询时遇到问题。

该函数将触发并循环遍历 id 数组,但它不会将新行插入到我的 player_game 表中,以表示 play 1、2、3、4 和 5 现在能够记录一些统计信息。

我已经看得很远了,但没有运气弄清楚这一点。将插入循环到 player_game 表中时,我一定做错了。

【问题讨论】:

  • 我不确定这一点,但是可以在“}”之后调用吗?!??我认为这样做的正确方法是将链调用添加到 .returning(id)
  • 应该就像一个承诺声明。没有它,逻辑本质上将是异步的。
  • 您确定将 then 调用链接到返回不会解决问题吗?我不是 JS 专家,我不明白你的答案,但我认为这会解决它

标签: javascript postgresql knex.js


【解决方案1】:

想通了:需要使用 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})
    })
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多