像 Knex 这样的关系数据库框架真的在 NodeJS 上使用异步 IO 吗?

Is relational db frameworks like Knex really use asynchronous IO on NodeJS?

我读到关系数据库管理系统 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,但是因为 PostGres 和 MySQL 是异步的(它们在您的节点和数据库服务器之间实现某种通信协议)因此,它需要利用 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,这意味着任务在事件循环中排队 -> 这意味着它是异步的。