配置、打开和关闭 Realm - Node.js SDK
在此页面上
打开 Realm
要打开本地(非同步) 域,请将 Realm .Configuration对象传递给异步方法Realm.open()。
注意
访问默认 Realm 路径
如果您未在 Configuration
对象中指定 path
属性,SDK 将在默认路径中创建一个域。您可以使用 Realm.defaultPath
全局属性访问和更改默认域路径。
// Open a local realm file with a predefined Car object model const realm = await Realm.open({ schema: [Car], });
无需提供模式即可开启 Realm
在设备上创建 Realm 后,您可以在通过调用new Realm()
访问同一 Realm 时省略模式。 SDK 从 Realm.defaultPath
的现有 Realm 文件中派生出该 Realm 的模式。
在不提供模式的情况下访问 Realm 仅适用于本地 Realm。使用同步 Realm 时,必须始终传递模式。
// Open the Realm with a schema const realm = new Realm({ schema: [Car] }); realm.close(); // Reopen it without a schema const reopenedRealm = new Realm();
打开内存中 Realm
要创建一个完全在内存中运行而不写入文件的域,请将 inMemory: true
添加到您的 Realm.Configuration 对象中:
const realm = await Realm.open({ inMemory: true, schema: [Car], });
注意
如果内存不足,内存中 Realm 可能会使用磁盘空间;但关闭 Realm 时,内存中 Realm 创建的文件将被删除。
复制数据并打开 Realm
版本 10.14.0 中的新增功能。
要将数据从现有域复制到具有不同配置选项的新域,请为新配置传递 Realm.writeCopyTo() 方法。
在新域的配置中,您必须指定 path
。
如果将复制的 Realm 写入已存在的 Realm 文件,则数据将逐个对象写入。 如果给定主键已经存在对象,则复制操作会替换对象。 您复制的 Realm 和您正在写入的 Realm 模式必须兼容,复制操作才能成功。 仅复制两种配置模式中的对象。
配置更改可以包括对SyncConfiguration 的修改:
本地 Realm 到同步 Realm
同步 Realm 到本地 Realm
将同步 Realm 到其他用户的同步 Realm
注意
仅限基于分区的同步
此方法仅支持在非同步 Realm 和基于分区的同步之间进行转换。如果应用程序使用“灵活同步”,则必须手动遍历一个 Realm 中的对象,并将其复制到另一个 Realm。
注意
仅限同类型同步
此方法仅支持复制另一个基于分区的同步用户的基于分区的同步配置,或复制另一个 Flexible Sync 用户的 Flexible Sync 配置。 您不能使用此方法在基于分区的同步 Realm 和 Flexible Sync Realm 之间进行转换,反之亦然。
配置更改还可以包括对Configuration
的encryptionKey
属性的更改:
加密 Realm 到未加密 Realm
未加密 Realm 到加密 Realm
例子
将本地 Realm 转换为同步 Realm
const localConfig = { schema: [Car], path: "localOnly.realm", }; const localRealm = await Realm.open(localConfig); const syncedConfig = { schema: [Car], path: "copyLocalToSynced.realm", sync: { user: app.currentUser, partitionValue: "myPartition", }, }; localRealm.writeCopyTo(syncedConfig); const syncedRealm = await Realm.open(syncedConfig);
const localConfig: Realm.Configuration = { schema: [Car], path: "localOnly.realm", }; const localRealm = await Realm.open(localConfig); const syncedConfig: Realm.Configuration = { schema: [Car], path: "copyLocalToSynced.realm", sync: { user: app.currentUser!, partitionValue: "myPartition", }, }; localRealm.writeCopyTo(syncedConfig); const syncedRealm = await Realm.open(syncedConfig);
您还可以合并对配置的更改。例如,您可以将本地加密域作为同步的未加密域打开,或者将未加密的同步域作为加密的同步域打开。
例子
将同步加密 Realm 转换为本地未加密 Realm
// Create a secure key. const encryptionKey = new Int8Array(64); // ... store key const syncedEncryptedConfig = { schema: [Car], path: "syncedEncrypted.realm", sync: { user: app.currentUser, partitionValue: "myPartition", }, encryptionKey, }; const syncedEncryptedRealm = await Realm.open(syncedEncryptedConfig); const localUnencryptedConfig = { schema: [Car], path: "copyLocalUnencrypted.realm", }; syncedEncryptedRealm.writeCopyTo(localUnencryptedConfig); const localUnencryptedRealm = await Realm.open(syncedEncryptedConfig);
// Create a secure key. const encryptionKey = new Int8Array(64); // ... store key const syncedEncryptedConfig: Realm.Configuration = { schema: [Car], path: "syncedEncrypted.realm", sync: { user: app.currentUser!, partitionValue: "myPartition", }, encryptionKey, }; const syncedEncryptedRealm = await Realm.open(syncedEncryptedConfig); const localUnencryptedConfig: Realm.Configuration = { schema: [Car], path: "copyLocalUnencrypted.realm", }; syncedEncryptedRealm.writeCopyTo(localUnencryptedConfig); const localUnencryptedRealm = await Realm.open(syncedEncryptedConfig);
关闭 Realm
请务必记住在完成 Realm 实例后调用 close()
方法,以避免内存泄漏。
realm.close();
使用 HTTP 代理
Realm Node.js SDK 对在 HTTP 代理后面运行的支持有限。
要求
Realm Node.js SDK v10.3.0 或更高版本。
需要 NPM CLI v6.9.0 或更高版本。
限制
您必须安装 fetch-with-proxy 手动包。
客户端到代理服务器的 HTTPS 连接不予支持。在
HTTPS_PROXY
中指定的 URL 必须以http://
开头。您必须设置
HTTPS_PROXY
环境变量。无法在运行时或按每个应用设置代理。
安装 fetch-with-proxy
需要手动步骤来切换网络传输层使用的 node-fetch
包。
安装 Realm Node.js SDK 后,运行以下命令,以在网络传输包中安装一个不同的包:
npm install node-fetch@npm:fetch-with-proxy --prefix node_modules/realm-network-transport
设置 HTTPS_PROXY 并运行脚本
您可以运行任意脚本文件,同时通过 HTTP 代理路由 Realm JS 的所有请求。
在 UNIX 系统上,您可以在命令前添加为环境变量赋值的前缀:
HTTPS_PROXY=http://127.0.0.1:3128 node index.js