feathers-mongoose: Mongo-DB Transaction - ReferenceError: wh



我使用的是Feathers 4.5.0和Mongo 5.0.2。我想在一个集合上执行mongodb事务。我将feather-mongoose文档中的示例复制到我的服务钩子中。

const TransactionManager = require('feathers-mongoose').TransactionManager;
const isTransactionEnable = process.env.TRANSACTION_ENABLE || false;
const skipPath = ['login'];
let moduleExports = {
before: {
all: [],
find: [],
get: [],
create: [
when(isTransactionEnable, async hook =>
TransactionManager.beginTransaction(hook, skipPath)
)
],
update: [
when(isTransactionEnable, async hook =>
TransactionManager.beginTransaction(hook, skipPath)
)
],
patch: [],
remove: []
},
after: {
all: [],
find: [],
get: [],
create: [when(isTransactionEnable, TransactionManager.commitTransaction)],
update: [when(isTransactionEnable, TransactionManager.commitTransaction)],
patch: [],
remove: []
},
error: {
all: [],
find: [],
get: [],
create: [when(isTransactionEnable, TransactionManager.rollbackTransaction)],
update: [when(isTransactionEnable, TransactionManager.rollbackTransaction)],
patch: [],
remove: []
}
};
module.exports = moduleExports;

我得到这个错误信息ReferenceError: when is not defined。我去掉了"when">

如果你在本地设置MongoDB副本有问题,当我浏览这个问题时,这个youtube教程对我很有用。在transactionmanager完成它的工作之前,你的副本数据库必须工作。我对示例代码

做了一些调整
const TransactionManager = require('feathers-mongoose').TransactionManager;
const isTransactionEnable = process.env.TRANSACTION_ENABLE || false;
const skipPath = ['login'];

module.exports = {
before: {
all: [],
find: [],
get: [],
create: [(isTransactionEnable, async hook =>
TransactionManager.beginTransaction(hook, skipPath)
)],
update: [(isTransactionEnable, async hook =>
TransactionManager.beginTransaction(hook, skipPath)
)],
patch: [(isTransactionEnable, async hook =>
TransactionManager.beginTransaction(hook, skipPath)
)],
remove: []
},
after: {
all: [],
find: [],
get: [],
create: [(isTransactionEnable, async () => {await TransactionManager.commitTransaction;})],
update: [(isTransactionEnable, async () => {await TransactionManager.commitTransaction;})],
patch: [(isTransactionEnable, async () => {await TransactionManager.commitTransaction;})],
remove: []
},
error: {
all: [],
find: [],
get: [],
create: [(isTransactionEnable, async () => {await TransactionManager.rollbackTransaction;})],
update: [(isTransactionEnable, async () => {await TransactionManager.rollbackTransaction;})],
patch: [(isTransactionEnable, async () =>{await TransactionManager.rollbackTransaction;})],
remove: []
}
};

在进行这些更改之后,我在更新用户集合时触发了一个错误,transactionmanager按预期工作

const newUser = app.service('users').create({name:'ope', gender:'Male')}
app.service('users').patch(newUser._idl,{gender: 'Female'}); //this fails and transaction rollback users collection to initate state. 

这行代码将失败,因为它期待newUser。_id but newUser。提供了_idl。因此,用户"操作"将从数据库中删除。

最新更新