-
有关 @nocobase/database transaction 的问题。 代码: db.on('nft.afterUpdateWithAssociations', async (model, options) => {
const { transaction } = options;
eventEmitter.emit('ntfSeriesResetValues', { db, seriesIds, transaction }); // 报错
// await updateNftSeries({ db, seriesIds, transaction }); // 正常使用
});
class MyEmitter extends EventEmitter {}
const eventEmitter = new MyEmitter();
eventEmitter.on('ntfSeriesResetValues', async function ({ db, seriesIds, transaction }) {
await updateNftSeries({ db, seriesIds, transaction });
}); 直接调用 updateNftSeries 方法(使用 repository api),正常执行。 eventEmitter.emit()触发执行相同的 updateNftSeries 方法,则会报错:
eventEmitter 应该是同步的,另外,nocobase自身也在使用。 @chenos 那么是不是 nocobase 对 transaction 在 EventEmitter 使用有什么限制或者要求么? |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 3 replies
-
可以再试试,是因为之前 transaction 丢失了,问题已修复 #531 |
Beta Was this translation helpful? Give feedback.
-
新的修复未在这里起到作用。 我新 clone 了一个 nocobase main 分支,通过
只要是直接使用 完整的代码可以参见这里:https://github.com/MarshalW/my-nocobase-app/blob/nft/packages/plugins/nft/src/server/nft.ts |
Beta Was this translation helpful? Give feedback.
-
看了下,不能用 emit,要用 db.emitAsync,不然会导致 transaction 提前被 commit 了 |
Beta Was this translation helpful? Give feedback.
-
在 按照你所说的可以正常执行: await db. emitAsync('ntfSeriesResetValues', { db, seriesIds, transaction }); 也就是说,不能自己创建: const eventEmitter = new MyEmitter(); 而是要把 |
Beta Was this translation helpful? Give feedback.
在
Version 0.7.1-alpha.7
下测试没有问题了。按照你所说的可以正常执行:
也就是说,不能自己创建:
而是要把
eventEmitter
换为db