Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

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

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 .

Antes de configurar um Realm com Flexible Sync em uma aplicação Node.js:

  1. Habilitar Flexible Sync no backend. Você deve configurar o Flexible Sync no backend antes de poder usá-lo com seu aplicação cliente.

  2. Inicialize a aplicação do cliente.

  3. Autenticar um usuário em seu projeto de cliente.

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.

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 e baseFilePath está definido. Seu arquivo Realm está armazenado em baseFilePath.

  • Realm.Configuation.path está definido para um caminho relativo. Seu arquivo Realm está armazenado em relação a baseFilePath.

  • Realm.Configuration.path é um caminho absoluto. Seu arquivo Realm está armazenado em Realm.Configuration.path.

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.

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);

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);

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);

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,
},
};

Voltar

Sincronizar dados