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”不存在而失败`

Knex NodeJS 并插入数据库

javascript upsert使用knex(nodejs)

nodejs插件knex & 日志打印

knex:从结果创建数组的适当方法是啥?

升级 Knex 后出现“获取连接超时”