带有 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 中正确设置“updatedAt”时间戳?