Realm JS 实战:Node.js 连接状态与错误处理详解
项目概述
本文基于 Realm JS 的 Node.js 示例项目,深入讲解如何在使用 Atlas Device SDK for Node.js 时处理连接状态变更、用户状态变更、同步错误等关键场景。该项目模拟了一个商店管理系统,包含商品库存管理功能,是学习 Realm 同步机制的绝佳案例。
核心功能架构
项目结构解析
├── backend - 后端服务配置
├── node - Node.js 应用
│ ├── src
│ │ ├── atlas-app-services - Atlas 应用配置
│ │ ├── models - 数据模型定义
│ │ ├── utils - 工具类
│ │ ├── app.ts - 应用入口
│ │ ├── demo-auth-triggers.ts - 认证监听器
│ │ ├── demo-sync-triggers.ts - 同步监听器
│ │ └── store-manager.ts - 数据管理核心
关键技术点
-
认证系统
- 支持邮箱/密码认证方式
- 处理注册/登录的各种异常场景
- 用户凭证自动缓存机制
-
同步会话监控
- 连接状态变更监听
- 同步错误捕获与处理
- 客户端重置(Client Reset)机制
-
数据模型设计
- 简化的商店-商品模型
- 灵活的订阅查询机制
- 离线优先的数据访问策略
深度技术解析
连接状态管理
Realm 的同步会话(Sync Session)提供了完整的连接状态监控能力。通过注册监听器,开发者可以感知以下关键事件:
Realm.App.Sync.addConnectionNotification(app, (newState, oldState) => {
// 处理连接状态变更
});
典型状态包括:
- 连接中(Connecting)
- 已连接(Connected)
- 断开连接(Disconnected)
- 重连失败(FailedToConnect)
同步错误处理
同步错误处理采用集中式回调设计:
const config: Realm.Configuration = {
sync: {
error: (session, error) => {
// 统一处理所有同步错误
}
}
};
常见错误类型:
- 权限不足错误
- 客户端重置错误(ClientReset)
- 网络连接错误
- 数据冲突错误
客户端重置策略
当服务器与客户端数据出现不可调和的差异时,会触发客户端重置。Realm 提供多种恢复策略:
- 自动恢复策略:尝试保留未同步的本地变更
- 丢弃变更策略:直接使用服务器数据
- 手动恢复策略:自定义恢复逻辑
示例项目中通过 Atlas Function 模拟了重置场景:
// 后端函数示例
exports = function() {
const service = context.services.get("mongodb-atlas");
return service.deleteAllUsersSessionData();
};
离线优先设计
项目采用了典型的离线优先架构:
-
即时打开策略:
OpenRealmBehaviorType.OpenImmediately
- 优先使用本地数据
- 后台静默同步更新
-
数据订阅机制:仅同步必要数据
const subscriptions = realm.subscriptions; subscriptions.update(() => { subscriptions.add( realm.objects("Product").filtered("storeId == $0", storeId) ); });
-
冲突自动解决:基于时间戳的自动合并
实战配置指南
环境准备
-
基础依赖:
- Node.js 16+
- MongoDB Atlas 集群
-
应用服务配置:
- 启用 Email/Password 认证
- 配置 Flexible Sync
- 设置开发模式(自动推断模式)
关键配置项
-
Realm 初始化配置:
const realmConfig: Realm.Configuration = { schema: [Product, Store, Kiosk], sync: { user: currentUser, partitionValue: storeId, error: handleSyncError, existingRealmFileBehavior: { type: OpenRealmBehaviorType.OpenImmediately } } };
-
日志系统配置:
Realm.setLogLevel("debug"); Realm.setLogger((level, message) => { // 集成自定义日志系统 });
典型场景测试
项目提供了多种测试脚本:
# 正常流程测试
npm run success
# 同步错误测试
npm run sync-error
# 客户端重置测试
npm run client-reset
性能优化建议
-
订阅优化:
- 最小化订阅数据量
- 使用精确查询条件
-
连接策略:
- 合理设置心跳间隔
- 实现指数退避重连
-
本地存储:
- 定期压缩 Realm 文件
- 合理设置本地缓存策略
常见问题排查
-
权限问题:
- 检查 IP 白名单设置
- 验证数据访问规则
-
同步失败:
- 检查网络连接状态
- 验证订阅查询条件
-
数据不一致:
- 检查客户端重置日志
- 验证冲突解决策略
总结
本示例项目全面展示了 Realm JS 在 Node.js 环境下的高级特性使用方式,特别是:
- 健壮的连接状态管理
- 完善的错误处理机制
- 灵活的离线数据策略
- 高效的同步控制能力
这些技术要点构成了企业级移动应用的数据同步基础,开发者可以根据实际需求调整配置策略,构建稳定可靠的同步应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考