Configurar e abrir um domínio sincronizado Realm - do Node.js SDK
Nesta página
- Domínios sincronizados
- Pré-requisitos
- Abrir um realm sincronizado
- Abrir o realm sincronizado no caminho específico
- Abrir um Realm sincronizado enquanto estiver offline
- Abrir imediatamente com sincronização em background
- Abrir após o tempo-limite com sincronização em background
- Sincronizar alterações em segundo plano
- Cancelar operações assíncronas após um tempo-limite
Domínios sincronizados
Você pode configurar um domínio para sincronizar automaticamente os dados entre vários dispositivos, cada um com sua própria cópia local dos dados. Os domínios sincronizados usam uma configuração diferente dos domínios somente locais e exigem um backend do Atlas App Services para lidar com o processo de sincronização.
Os aplicativos podem sempre criar, modificar e excluir objetos de Realm sincronizados localmente, mesmo quando estiver offline. Sempre que uma conexão de rede está disponível, o Realm SDK abre uma conexão com um servidor de aplicação e sincroniza as alterações de e para outros clientes. O protocolo Atlas Device Sync e as transformações operacionais do lado do servidor garantem que todas as instâncias totalmente sincronizadas de um Realm vejam exatamente os mesmos dados, mesmo que algumas alterações tenham ocorrido offline e/ou tenham sido recebidas fora de ordem.
Dica
Saiba como configurar e usar a sincronização
Para obter mais informações sobre domínios sincronizados, incluindo instruções sobre como configurar a sincronização em um aplicativo Realm , consulte Visão geral do Atlas Device Sync .
Pré-requisitos
Antes de configurar um Realm com Flexible Sync em uma aplicação Node.js:
Habilitar Flexible Sync no backend. Você deve configurar o Flexible Sync no backend antes de poder usá-lo com seu aplicação cliente.
Autenticar um usuário em seu projeto de cliente.
Abrir um realm sincronizado
A primeira etapa na implementação do Device Sync é abrir o Realm sincronizado. As informações a seguir pertencem a um aplicativo que usa o Flexible Sync. Se o seu aplicativo existente usa a sincronização antiga baseada em partição, consulte Abrir um Realm sincronizado baseado em partição. Se você ainda não decidiu ou não sabe qual usar, leia a página Escolha seu modo de sincronização .
Para abrir um Realm usando o Flexible Sync, chame Realm.open(). Passe um objeto ConfigurationWithSync , que deve incluir a propriedade sync
definindo um objeto SyncConfiguration . No SyncConfiguration, você deve incluir um user
e flexible:true
.
const realm = await Realm.open({ schema: [TaskSchema, TeamSchema], sync: { user: app.currentUser, flexible: true, }, });
Por padrão, o Realm sincroniza todos os dados do servidor antes de retornar. Se você quiser sincronizar dados em segundo plano, leia a seção Abrir um Realm sincronizado enquanto estiver offline .
Importante
A Flexible Sync exige uma assinatura
Você não pode usar um Realm do Flexible Sync até adicionar pelo menos uma assinatura. Para saber como adicionar assinaturas, consulte: Adicionar uma assinatura.
Abrir o realm sincronizado no caminho específico
Novidades na versão realm@11.6.0
.
Usando AppConfiguration.baseFilePath e Realm.Configuration.path, você pode controlar onde os arquivos Realm e metadados são armazenados em dispositivos do cliente .
Para fazer isso, configure <AppProvider>.baseFilePath
. Se baseFilePath
não estiver definido, o diretório de trabalho atual será usado. Você também pode definir <RealmProvider>.sync.path
para ter mais controle.
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, }, });
Se baseFilePath
estiver configurado, os metadados serão sempre armazenados no <baseFilePath>/mongodb-realm/
. Se baseFilePath
não estiver definido, os metadados serão armazenados em <Realm.defaultPath>/mongodb-realm
.
O local exato onde seu arquivo de Realm é armazenado varia dependendo de como você define Realm.Configuration.path:
Realm.Configuration.path
não está definido ebaseFilePath
está definido. Seu arquivo Realm está armazenado embaseFilePath
.Realm.Configuation.path
está definido para um caminho relativo. Seu arquivo Realm está armazenado em relação abaseFilePath
.Realm.Configuration.path
é um caminho absoluto. Seu arquivo Realm está armazenado emRealm.Configuration.path
.
Abrir um Realm sincronizado enquanto estiver offline
Quando seu aplicativo Realm autentica um usuário, armazena em cache as credenciais do usuário. Você pode verificar as credenciais de usuário existentes para ignorar o fluxo de login e acessar o usuário em cache. Use isto para abrir um realm offline.
Observação
O login inicial exige uma conexão de rede
Quando um usuário se inscreve em seu aplicativo ou faz login pela primeira vez com uma conta existente em um cliente, o cliente deve ter uma conexão de rede. A verificação de credenciais de usuário em cache permite que você abra um domínio offline, mas somente se o usuário já tiver feito login enquanto estiver online.
// 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!; };
As subseções a seguir mostram como usar a sincronização de plano de fundo para acessar um domínio enquanto estiver off-line. Para fazer isso, use o usuário em cache e um objeto OpenRealmBehaviorConfiguration .
Na configuração de sincronização, defina os campos newRealmFileBehavior
e existingRealmFileBehavior
opcionais para o objeto OpenRealmBehaviorConfiguration
para habilitar a sincronização em segundo plano.
Importante
O login offline é suportado para configurações de sincronização flexíveis e baseadas em partição
Você pode abrir um Realm imediatamente com a sincronização em segundo plano ou após decorrido um tempo-limite usando o Flexible Sync ou a antiga sincronização baseada em partição.
A sincronização baseada em partição é um modo de sincronização desatualizado. Consulte a página sincronização baseada em partição - Node.js SDK para obter detalhes sobre como usar a sincronização baseada em partição para sua aplicação.
Abrir imediatamente com sincronização em background
Se o dispositivo do usuário não estiver conectado à Internet ou você não tiver certeza do status da conexão, defina o tipo de comportamento do domínio como openImmediately
. Isso sincroniza dados do servidor em 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 após o tempo-limite com sincronização em background
Se você quiser sincronizar dados, mas estiver em um ambiente em que não se sabe se o usuário tem uma conexão com a Internet, especifique timeOut
. Isso abre automaticamente o domínio quando:
o período de tempo limite termina.
o realm foi completamente baixado.
Se o domínio não terminar de baixar antes do tempo-limite, a sincronização inicial do domínio continuará em 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 alterações em segundo plano
Talvez você queira sincronizar as alterações em segundo plano para exibir dados parciais para o usuário enquanto o domínio sincronizado baixa os dados do servidor, evitando que a experiência do usuário seja bloqueada. Recomendamos sincronizar alterações em segundo plano para aplicativos em que o dispositivo do usuário possa ficar off-line. Para sincronizar alterações no plano de fundo, abra um domínio sincronizado de forma sincronizada.
Crie um objeto OpenRealmBehaviorConfiguration e defina seu type
como "openImmediately"
.
const behaviorConfiguration = { type: "openImmediately", };
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: Realm.OpenRealmBehaviorType.OpenImmediately, };
Crie um objeto de configuração , que deve incluir a propriedade sync
definindo um objeto SyncConfiguration . Defina este objeto OpenRealmBehaviorConfiguration
como o valor para os campos newRealmFileBehavior
e existingRealmFileBehavior
do SyncConfiguration
.
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, }, };
Por fim, chame Realm.open() para abrir um Realm sincronizado. Isso criará uma sessão de sincronização e começará a baixar todos os dados existentes do servidor em segundo plano.
const realm = await Realm.open(config);
Cancelar operações assíncronas após um tempo-limite
Novo na versão 12.0.0.
Você pode especificar uma propriedade cancelWaitsOnNonFatalErrors
em seu objeto BaseSyncConfiguration .
Quando true
, o Node.js SDK cancela operações assíncronas, como esperar por uploads ou downloads, quando um período de tempo limite termina. Você pode definir o tempo limite para essa opção no AppConfiguration. Para obter um exemplo, consulte Configurar um tempo limite para o cliente do aplicativo.
Esta propriedade é padronizada para false
se você não especificar um 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, }, };