使用feathers-mongoose实现MongoDB事务时出现when未定义报错
Feathers 4.5.0 + MongoDB 5.0.2 事务问题解决方案
1. 修复 ReferenceError: when is not defined 报错
when 是 Feathers 生态专门用于钩子条件判断的工具函数,归属于 feathers-hooks-common 依赖包,你需要先完成安装和导入:
- 执行安装命令:
npm install feathers-hooks-common - 在你的钩子文件顶部添加导入语句:
const { when } = require('feathers-hooks-common');
不要直接删除代码中的when关键字,删除后事务逻辑会忽略 isTransactionEnable 的配置强制执行,反而会引发更多逻辑异常。
2. 修复事务不生效问题
要让事务正常运行,还需要逐一核对以下配置:
- 确认 MongoDB 实例为副本集/分片集群模式:MongoDB 原生的事务功能仅支持副本集或分片集群,单节点 standalone 模式不支持事务,这是 MongoDB 本身的功能限制。
- 修正环境变量判断逻辑:
process.env读取的所有值都是字符串类型,原代码中"false"字符串会被判定为真值,导致开关逻辑失效,修改为:
const isTransactionEnable = process.env.TRANSACTION_ENABLE === 'true';
- 确认 Mongoose 连接配置正确,Feathers 初始化 Mongoose 时需要开启统一拓扑支持,且连接地址需要携带副本集名称,示例配置:
app.configure(mongoose( 'mongodb://localhost:27017/你的数据库名?replicaSet=你的副本集名称', { useNewUrlParser: true, useUnifiedTopology: true } ));
- 跨服务调用时必须传递
params参数:事务会话会挂载在hook.params.mongoose.session上,多个服务操作要纳入同一个事务,必须在调用服务时传递当前钩子的params对象,例如:
await hook.app.service('other-service').create(data, hook.params);
- 确认所有涉及事务的服务都是基于
feathers-mongoose实现,且没有手动创建独立的 Mongoose 连接,所有数据库操作必须复用 Feathers 全局挂载的 Mongoose 连接才能共享事务会话。
内容的提问来源于stack exchange,提问作者Seunope
相关产品推荐
相关产品推荐

