node.js - 像 Knex 这样的关系数据库框架真的在 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');
});
你知道 Knexawait
调用是否真的使用真正的非阻塞 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
,这意味着任务在事件循环中排队 -> 这意味着它是异步的。
推荐阅读
- python - 在单个查询中获取所有顶点和边作为地图
- javascript - 在nestjs中使用类验证器验证可选参数?
- linux - VSCode 远程 Python 虚拟环境
- asp.net - Visual Studio 2019 右键单击 WebForms 缺少 Go To Definition
- android - java.lang.NoClassDefFoundError:解析失败:Ldji/common/flightcontroller/CompassCalibrationState
- php - 每个循环PHP的多输入和多列
- ibm-cloud - IBM Watson Assistant:如何解决 web_action 错误“内部错误:无法检索内容类型。”
- ios - Firebase 配置问题:Firebase Analytics 不可用
- typescript - 如何在 Jest 的 globalSetup 函数中使用模块导入 (@) 和 TypeScript?
- html - 随后在 CSS 中选择子元素