Realms sincronizados
Puedes configurar un dominio para que sincronice automáticamente datos entre varios dispositivos, cada uno con su propia copia local. Los dominios sincronizados utilizan una configuración diferente a la de los dominios locales y requieren un backend de Atlas App Services para gestionar el proceso de sincronización.
Las aplicaciones siempre pueden crear, modificar y eliminar objetos de dominio sincronizados localmente, incluso sin conexión. Siempre que haya una conexión de red disponible, el SDK de dominio abre una conexión con un servidor de aplicaciones y sincroniza los cambios con y desde otros clientes. El protocolo Atlas Device Sync y las transformaciones operativas del lado del servidor garantizan que todas las instancias totalmente sincronizadas de un reino vean exactamente los mismos datos, incluso si algunos cambios ocurrieron sin conexión y/o se recibieron fuera de orden.
Tip
Aprenda a configurar y utilizar la sincronización
Para obtener más información sobre los reinos sincronizados, incluidas las instrucciones sobre cómo configurar la sincronización en una aplicación Realm, consulte Descripción general de sincronización de dispositivos Atlas.
Requisitos previos
Antes de configurar un reino con sincronización flexible en una aplicación Node.js:
Habilite la sincronización flexible en el backend. Debe configurar la sincronización flexible en el backend para poder usarla con su aplicación cliente.
Autenticar un usuario en su proyecto cliente.
Abrir un reino sincronizado
El primer paso para implementar la Sincronización de Dispositivos es abrir el dominio sincronizado. La siguiente información corresponde a una aplicación que utiliza la Sincronización Flexible. Si su aplicación utiliza la sincronización basada en particiones, consulte "Abrir un dominio sincronizado basado en particiones". Si aún no ha decidido o no está seguro de cuál usar, consulte la página "Elija su modo de sincronización".
Para abrir un reino usando Sincronización flexible, llame a Realm.open(). Pase un objeto ConfigurationWithSync, que debe incluir el sync Propiedad que define un objeto SyncConfiguration. En SyncConfiguration, debe incluir user flexible:truey.
const realm = await Realm.open({ schema: [TaskSchema, TeamSchema], sync: { user: app.currentUser, flexible: true, }, });
De forma predeterminada, Realm sincroniza todos los datos del servidor antes de regresar. Si desea sincronizar datos en segundo plano, consulte la sección "Abrir un Realm sincronizado sin conexión".
Importante
La sincronización flexible requiere una suscripción
No puedes usar un dominio de sincronización flexible hasta que agregues al menos una suscripción. Para saber cómo agregar suscripciones, consulta: Agregar una suscripción.
Abrir reino sincronizado en una ruta específica
Novedades en la realm@11.6.0 versión.
Al utilizar AppConfiguration.baseFilePath y Realm.Configuration.path, puede controlar dónde se almacenan los archivos de metadatos y de Realm en los dispositivos cliente.
Para ello, configure <AppProvider>.baseFilePath. Si no se configura baseFilePath, se utiliza el directorio de trabajo actual. También puede configurar <RealmProvider>.sync.path para mayor control.
const app = new Realm.App({ id: APP_ID, baseFilePath: customPath }); const user = await app.logIn(Realm.Credentials.anonymous()); const realm = await Realm.open({ schema: [Car], sync: { flexible: true, user, }, });
Si se configura baseFilePath, los metadatos siempre se almacenan en <baseFilePath>/mongodb-realm/. Si no se configura baseFilePath, se almacenan en <Realm.defaultPath>/mongodb-realm.
El lugar exacto donde se almacena su archivo Realm puede variar dependiendo de cómo configure Realm.Configuration.path:
Realm.Configuration.pathNo está configurado ybaseFilePathestá configurado. Su archivo de Realm se almacena enbaseFilePath.Realm.Configuation.pathSe establece en una ruta relativa. El archivo de Realm se almacena en relación conbaseFilePath.Realm.Configuration.pathEs una ruta absoluta. Tu archivo Realm se almacena enRealm.Configuration.path.
Abrir un reino sincronizado sin conexión
Cuando tu aplicación Realm autentica a un usuario, almacena en caché las credenciales del usuario. Puedes comprobar si existen credenciales de usuario para omitir el flujo de inicio de sesión y acceder al usuario almacenado en caché. Usa esto para abrir un realm sin conexión.
Nota
El inicio de sesión inicial requiere una conexión de red
Cuando un usuario se registra en tu aplicación o inicia sesión por primera vez con una cuenta existente en un cliente, este debe tener conexión de red. Comprobar las credenciales de usuario en caché permite abrir un reino sin conexión, pero solo si el usuario ha iniciado sesión previamente con conexión.
// Log user into your App Services App. // On first login, the user must have a network connection. const getUser = async () => { // If the device has no cached user credentials, log in. if (!app.currentUser) { const credentials = Realm.Credentials.anonymous(); await app.logIn(credentials); } // If the app is offline, but credentials are // cached, return existing user. return app.currentUser!; };
Las siguientes subsecciones muestran cómo usar la sincronización en segundo plano para acceder a un dominio sin conexión. Para ello, utilice el usuario en caché y un objeto OpenRealmBehaviorConfiguration.
Dentro de su configuración de sincronización, configure los campos opcionales newRealmFileBehavior y existingRealmFileBehavior en su objeto OpenRealmBehaviorConfiguration para habilitar la sincronización en segundo plano.
Importante
El inicio de sesión sin conexión es compatible con configuraciones de sincronización flexibles y basadas en particiones
Puede abrir un reino inmediatamente con sincronización en segundo plano o después de que transcurra un tiempo de espera utilizando la sincronización flexible o la antigua sincronización basada en particiones.
La sincronización basada en particiones es un modo de sincronización obsoleto. Consulta la página Sincronización basada en particiones - SDK de Node.js para obtener más información sobre su uso en tu aplicación.
Abrir inmediatamente con sincronización en segundo plano
Si el dispositivo del usuario no está conectado a Internet o hay incertidumbre sobre el estado de su conexión, establecer el tipo de comportamiento del realm como openImmediately. Esto sincroniza los datos desde el servidor en segundo plano.
const behaviorConfiguration = { type: "openImmediately", }; const config = { schema: [Car], sync: { user: await getUser(), flexible: true, newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: "openImmediately", }; const config: Realm.Configuration = { schema: [Car], sync: { user: await getUser(), flexible: true, newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
Abrir después del tiempo de espera con sincronización en segundo plano
Si desea sincronizar datos, pero se encuentra en un entorno donde no se sabe con certeza si el usuario tiene conexión a Internet, especifique timeOut. Esto abre automáticamente el dominio cuando:
transcurre el tiempo de espera.
El reino se ha descargado completamente.
Si el reino no termina de descargarse antes del tiempo de espera, la sincronización inicial del reino continúa en segundo plano.
const behaviorConfiguration = { type: "openImmediately", timeOut: 1000, timeOutBehavior: "openLocalRealm", }; const config = { schema: [Car], sync: { flexible: true, user: await getUser(), existingRealmFileBehavior: behaviorConfiguration, newRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: "openImmediately", timeOut: 1000, timeOutBehavior: "openLocalRealm", }; const config: Realm.Configuration = { schema: [Car], sync: { flexible: true, user: await getUser(), existingRealmFileBehavior: behaviorConfiguration, newRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
Sincronizar cambios en segundo plano
Es posible que desee sincronizar los cambios en segundo plano para mostrar datos parciales al usuario mientras el dominio sincronizado descarga datos del servidor, lo que evita que la experiencia del usuario se vea bloqueada. Recomendamos sincronizar los cambios en segundo plano para las aplicaciones en las que el dispositivo del usuario pueda desconectarse. Para sincronizar los cambios en segundo plano, abra un dominio sincronizado sincrónicamente.
Cree un objeto OpenRealmBehaviorConfiguration y establezca su type "openImmediately"en.
const behaviorConfiguration = { type: "openImmediately", };
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: Realm.OpenRealmBehaviorType.OpenImmediately, };
Cree un objeto Configuration, que debe incluir la sync propiedad que define un objeto SyncConfiguration. Establezca este OpenRealmBehaviorConfiguration objeto como valor para los newRealmFileBehavior existingRealmFileBehavior campos y SyncConfiguration de.
const config = { schema: [DogSchema], sync: { user: app.currentUser, partitionValue: "MyPartitionValue", // The behavior to use when this is the first time opening a realm. newRealmFileBehavior: behaviorConfiguration, // The behavior to use when a realm file already exists locally, // i.e. you have previously opened the realm. existingRealmFileBehavior: behaviorConfiguration, }, };
const config: Realm.Configuration = { schema: [DogSchema], sync: { user: app.currentUser!, partitionValue: "MyPartitionValue", // The behavior to use when this is the first time opening a realm. newRealmFileBehavior: behaviorConfiguration, // The behavior to use when a realm file already exists locally, // i.e. you have previously opened the realm. existingRealmFileBehavior: behaviorConfiguration, }, };
Finalmente, llama a Realm.open() para abrir un reino sincronizado. Esto creará una sesión de sincronización y comenzará a descargar los datos existentes del servidor en segundo plano.
const realm = await Realm.open(config);
Cancelar operaciones asincrónicas después de un tiempo de espera
Nuevo en la versión 12.0.0.
Puede especificar una cancelWaitsOnNonFatalErrors propiedad en su objeto BaseSyncConfiguration.
trueCuando, el SDK de Node.js cancela las operaciones asíncronas, como la espera de cargas o descargas, al transcurrir un tiempo de espera. Puede definir el tiempo de espera para esta opción en AppConfiguration. Para ver un ejemplo, consulte Configurar un tiempo de espera para el cliente de la aplicación.
Esta propiedad tiene como valor predeterminado false si no especifica un valor.
const config = { schema: [Doggie], sync: { flexible: true, user: app.currentUser, // When `true`, upload and download waits are canceled on any // error, such as a timeout, instead of just a fatal error. // You can provide an optional timeouts property in milliseconds. cancelWaitsOnNonFatalError: true, }, };
const config: Realm.Configuration = { schema: [Doggie], sync: { flexible: true, user: app.currentUser!, // When `true`, upload and download waits are canceled on any // error, such as a timeout, instead of just a fatal error. // You can provide an optional timeouts property in milliseconds. cancelWaitsOnNonFatalError: true, }, };