Prisma调用create/update不加await不报错且数据未入库问题求解
Prisma操作省略await无报错也无数据变更的原理说明
核心本质
该行为是JavaScript异步编程特性与Prisma客户端设计共同作用的结果,不属于Bug。
具体实现逻辑
- Prisma客户端的所有CRUD方法,返回值均为标准Promise对象:调用
prisma.model.create()仅会生成待执行的异步数据库任务,不会立刻发起实际的数据库请求,任务会被推入Node.js事件循环的微任务队列等待调度。 - 省略
await关键字时,代码不会等待该Promise执行完成,会直接运行后续逻辑:如果是一次性运行的脚本,所有同步代码执行完成后进程会直接退出,队列中未调度的Prisma任务会被直接销毁,既不会发起数据库请求,也不会触发错误抛出(进程退出时未完成的Promise不会执行resolve/reject回调,自然不会抛出异常)。 - 如果是在长期运行的后端服务中漏写
await,虽然进程不会立刻退出,但你无法拿到数据库操作的返回结果,若操作执行出错会触发未捕获的Promise rejection告警,严重时会导致进程崩溃。
Prisma的设计逻辑
Prisma选择将所有数据库操作设计为异步Promise调用,主要有两个考量:
- 兼容JavaScript生态异步编程规范,支持
Promise.all()并发查询、异步事务等高级特性,避免同步阻塞IO占用主线程资源。 - 预留查询优化空间:Prisma支持批量操作、事务合并等优化逻辑,会在拿到一批待执行的操作后统一生成最优的SQL语句,若调用方法时就立刻执行SQL,这类优化能力无法实现。
示例代码
异常场景(无数据变更)
// Does not work prisma.model.create({ data: { name: 'tai', schema: { abc: 8, def: 8, }, } })
正常场景
// Works await prisma.model.create({ data: { name: 'tai', schema: { abc: 8, def: 8, }, } })
内容的提问来源于stack exchange,提问作者Ashfaq Ur Rahman N
相关产品推荐
相关产品推荐

