首页
/ Dexie.js 中如何区分用户操作与同步操作的技术解析

Dexie.js 中如何区分用户操作与同步操作的技术解析

2025-05-17 13:13:12作者:咎竹峻Karen

在 Dexie.js 数据库开发中,特别是结合 Dexie Cloud 插件使用时,开发者经常需要区分用户直接操作和后台同步操作。本文将深入探讨这一技术需求及其解决方案。

问题背景

当应用程序使用 Dexie.js 配合 Dexie Cloud 插件实现数据同步时,某些业务逻辑只需要在用户直接操作数据时触发,而不应在数据同步过程中执行。例如:

  • 用户创建新记录时需要触发特定业务逻辑
  • 当该记录同步到其他设备时不应再次触发相同逻辑

传统解决方案的局限性

开发者可能会尝试通过中间件(middleware)的优先级(level 参数)来解决这个问题,但这种方法存在本质缺陷:

  1. 中间件优先级只能控制执行顺序
  2. 无法跳过底层中间件的执行
  3. Dexie Cloud 的同步操作并非源自中间件

推荐解决方案

Dexie.js 提供了一个有效的解决方案:检查事务对象的 disableChangeTracking 属性。

实现方式

db.use({
  name: 'myMiddleware',
  level: 2, // 可选,设置中间件优先级
  create: function (trans) {
    // @ts-ignore
    if (trans.disableChangeTracking) {
      // 这是同步操作,跳过业务逻辑
      return;
    }
    // 这是用户操作,执行业务逻辑
  }
});

注意事项

  1. 该属性目前没有类型定义,需要使用 // @ts-ignore 忽略类型检查
  2. 对于 Dexie Cloud 内部表(以 $ 开头的表名),可能不会设置此属性
  3. 所有应用程序定义的同步表都会正确设置此属性

技术原理

disableChangeTracking 属性的设计理念是:

  • 为 true 时表示操作来自同步过程
  • 为 false 或 undefined 时表示操作来自用户直接交互

这种设计使得开发者能够精确控制业务逻辑的执行时机,确保数据同步过程不会触发不必要的业务处理。

最佳实践

  1. 将业务逻辑中间件设置为较高优先级(level 值较大)
  2. 在中间件开始处检查 disableChangeTracking 属性
  3. 对于关键业务逻辑,建议添加详细日志记录操作来源
  4. 考虑为 TypeScript 项目添加自定义类型声明,避免频繁使用 @ts-ignore

通过这种方案,开发者可以优雅地区分用户操作和同步操作,实现精确的业务逻辑控制,同时保持代码的清晰和可维护性。

登录后查看全文
热门项目推荐
相关项目推荐