带有 Express 的 Knex.js,如何在 knex.commit 后跟 knex.select 查询?

Posted

技术标签:

【中文标题】带有 Express 的 Knex.js,如何在 knex.commit 后跟 knex.select 查询?【英文标题】:Knex.js with Express, How can I knex.commit followed by a knex.select query? 【发布时间】:2021-01-23 00:12:41 【问题描述】:

我正在尝试执行以下操作。

    更新数据库 提交更新 在 JSON 响应中返回新记录

这是我拥有的代码,它可以更新数据酶,我投入了一些 console.logs() 来查看流程。 当前代码输出“World Hello”而不是“Hello World”。我怎样才能使输出成为“Hello World”?

app.post('/checkin', async (req, res) => 
db('assets').select('status').where('id', '=', req.body.id)
    .then(data => 
        currentStatus = data[0].status;
        if (currentStatus.slice(0, 10) === 'In Use By ' || currentStatus === 'Quarantine') 
            db('assets')
                .where('id', '=', req.body.id)
                .update( status: 'Available', comments: '' ).then(db.commit) 
                .then(console.log('Hello'))   
        
    )
    .then(console.log('World')) 
    .then(db('assets').select('*').where('id', '=', req.body.id)
        .then(data => res.status(200).json(data[0])))
    .catch(error => res.status(400).json(error))
);

【问题讨论】:

【参考方案1】:

如果您在内部承诺上添加回报,那应该可以解决问题。有关原因的详细信息,请参阅this answer。你也可以重构一些东西来使用await(现在你的async关键字会浪费),这将取消嵌套块,并澄清流程。注意:此代码未经测试,但它只是将您的代码更改为使用 async/await,所以我认为它会起作用:

app.post('/checkin', async (req, res) => 
  try 
    const data = await db('assets').select('status').where('id', '=', req.body.id)
    currentStatus = data[0].status;

    if (currentStatus.slice(0, 10) === 'In Use By ' || currentStatus === 'Quarantine') 
      await db('assets')
        .where('id', '=', req.body.id)
        .update( status: 'Available', comments: '' )

      await db.commit();
      console.log('Hello');
    

    console.log('World')
    const secondData = await db('assets').select('*').where('id', '=', req.body.id)
    res.status(200).json(secondData[0])
   catch (error) 
    res.status(400).json(error)
  
);

【讨论】:

以上是关于带有 Express 的 Knex.js,如何在 knex.commit 后跟 knex.select 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 knex.js 上为 CURRENT_TIMESTAMP 添加时间?

如何在 knex.js 迁移中链接承诺

如何在 Knex.js 中正确设置“updatedAt”时间戳?

如何在 knex.js 中的“join”的“on”条件下使用“and”

如何在 Knex JS 中使用 IS NOT NULL

如何使用 Knex.js 查询多对多关系?