Knex这样的关系型db框架在NodeJS上真的可以使用异步IO吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Knex这样的关系型db框架在NodeJS上真的可以使用异步IO吗?相关的知识,希望对你有一定的参考价值。
我看了一下,关系型数据库管理系统RBDMS,并不适合NodeJS非阻塞IO模式的神器。主要原因是RBDMS的连接和事务是有状态的。
我玩了一段时间的NodeJS、PostgreSQL和Knex。Knex允许我写这样的东西。
await knex.transaction(async (trx) => {
const _id = await trx.insert(data)
.into('customer')
.returning('id');
const customer_id = parseInt(_id[0]);
await trx.insert({
'customer_id': customer_id,
'created_at' : new Date(),
'op' : 'customer_creation'
})
.update({customer_id : customer_id})
.into('customer_history');
});
你知道Knex await
调用的是真正的非阻塞IO?还是使用了一些黑客的暗箱操作?
问候
伊万
答案
我不清楚knex支持的所有RBDMS,但由于Of PostGres & mysql都是异步的(它们在你的节点& DB服务器之间实现了某种通信协议),因此,它利用了Node.js的异步特性。
你可以很容易地检查它,使用 asCallback
而不是 Promise API。
knex
.transaction(async (trx) => {
console.log('1');
trx
.insert(data)
.into('customer')
.returning('id')
.asCallback(function (err, rows) {
rows;
});
console.log('2');
})
.asCallback(function (err, rows) {
console.log('3');
});
console.log('4');
并检查第一个 console.log
将是 4
,表示任务在事件循环中enqueued ->;表示是async。
以上是关于Knex这样的关系型db框架在NodeJS上真的可以使用异步IO吗?的主要内容,如果未能解决你的问题,请参考以下文章
Knex.js 迁移问题:因`关系“knex_migrations”不存在而失败`