Acionadores do Firebase Realtime Database
Com as funções do Cloud Run, pode processar eventos na Firebase Realtime Database no mesmo Google Cloud projeto que a função. As funções do Cloud Run permitem-lhe executar operações de base de dados com privilégios administrativos completos e garantem que cada alteração à base de dados é processada individualmente. Pode fazer alterações à base de dados em tempo real do Firebase através do SDK Firebase Admin.
Num ciclo de vida típico, uma função do Firebase Realtime Database faz o seguinte:
Aguarda alterações a uma localização específica da base de dados.
É acionado quando ocorre um evento e executa as respetivas tarefas.
Recebe um objeto de dados que contém um instantâneo dos dados armazenados no documento especificado.
Tipos de eventos
As funções permitem-lhe processar eventos da base de dados em dois níveis de especificidade. Pode ouvir especificamente apenas eventos de criação, atualização ou eliminação, ou pode ouvir qualquer alteração de qualquer tipo a um caminho. As funções do Cloud Run suportam os seguintes tipos de eventos para a Realtime Database:
Tipo de evento | Acionador |
---|---|
providers/google.firebase.database/eventTypes/ref.write |
Acionado em qualquer evento de mutação: quando os dados são criados, atualizados ou eliminados na Realtime Database. |
providers/google.firebase.database/eventTypes/ref.create (predefinição) |
Acionada quando são criados novos dados na Realtime Database. |
providers/google.firebase.database/eventTypes/ref.update |
Acionado quando os dados são atualizados na Realtime Database. |
providers/google.firebase.database/eventTypes/ref.delete |
Acionado quando os dados são eliminados da Realtime Database. |
Especificar o caminho e a instância da base de dados
Para controlar quando e onde a sua função deve ser acionada, tem de especificar um caminho e, opcionalmente, especificar uma instância da base de dados.
Caminho
As especificações de caminho correspondem a todas as escritas que tocam num caminho, incluindo as escritas que ocorrem em qualquer lugar abaixo do mesmo. Se definir o caminho da sua função como /foo/bar
, os eventos correspondem a ambas as localizações:
/foo/bar
/foo/bar/baz/really/deep/path
Em qualquer dos casos, o Firebase interpreta que o evento ocorre às /foo/bar
e os
dados do evento incluem os dados antigos e novos às /foo/bar
. Se os dados de eventos puderem ser grandes, considere usar várias funções em caminhos mais profundos em vez de uma única função perto da raiz da base de dados. Para o melhor desempenho, peça apenas dados no nível mais detalhado possível.
Pode especificar um componente do caminho como um caráter universal ao colocá-lo entre chavetas; foo/{bar}
corresponde a qualquer filho de /foo
. Os valores destes componentes do caminho com carateres universais estão disponíveis no objeto event.params
da sua função.
Neste exemplo, o valor está disponível como event.params.bar
.
Os caminhos com carateres universais podem corresponder a vários eventos de uma única gravação. Uma inserção de:
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
corresponde ao caminho /foo/{bar}
duas vezes: uma com "hello": "world"
e outra com "firebase": "functions"
.
Instância
Quando usar a Google Cloud consola, tem de especificar a instância da base de dados.
Quando usar a Google Cloud CLI, a instância tem de ser especificada como parte da string --trigger-resource
.
Por exemplo, o seguinte usaria o seguinte na sua string --trigger-resource
:
--trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/PATH
Estrutura de eventos
Quando processa um evento da Realtime Database, o objeto data
contém duas propriedades que são fornecidas no formato de objeto JSON:
data
: uma imagem instantânea dos dados obtidos antes do evento que acionou a função.delta
: uma imagem instantânea dos dados obtidos após o evento que acionou a função.
Exemplo de código
Node.js
Python
Go
Java
C#
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Firebase.Database.V1; using Microsoft.Extensions.Logging; using System.Threading; using System.Threading.Tasks; namespace FirebaseRtdb; public class Function : ICloudEventFunction<ReferenceEventData> { private readonly ILogger _logger; public Function(ILogger<Function> logger) => _logger = logger; public Task HandleAsync(CloudEvent cloudEvent, ReferenceEventData data, CancellationToken cancellationToken) { _logger.LogInformation("Function triggered by change to {subject}", cloudEvent.Subject); _logger.LogInformation("Delta: {delta}", data.Delta); // In this example, we don't need to perform any asynchronous operations, so the // method doesn't need to be declared async. return Task.CompletedTask; } }
Ruby
PHP
use Google\CloudFunctions\CloudEvent; function firebaseRTDB(CloudEvent $cloudevent) { $log = fopen(getenv('LOGGER_OUTPUT') ?: 'php://stderr', 'wb'); fwrite($log, 'Event: ' . $cloudevent->getId() . PHP_EOL); $data = $cloudevent->getData(); $resource = $data['resource'] ?? '<null>'; fwrite($log, 'Function triggered by change to: ' . $resource . PHP_EOL); $isAdmin = isset($data['auth']['admin']) && $data['auth']['admin'] == true; fwrite($log, 'Admin?: ' . var_export($isAdmin, true) . PHP_EOL); fwrite($log, 'Delta: ' . json_encode($data['delta'] ?? '') . PHP_EOL); }
Implementar a sua função
O seguinte comando gcloud implementa uma função que é acionada por eventos create
no caminho /messages/{pushId}/original
:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --entry-point ENTRY_POINT \ --trigger-event providers/google.firebase.database/eventTypes/ref.create \ --trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/messages/{pushId}/original \ --runtime RUNTIME
Argumento | Descrição |
---|---|
FUNCTION_NAME |
O nome registado da função do Cloud Run que está a implementar.
Pode ser o nome de uma função no seu código-fonte ou uma string arbitrária. Se FUNCTION_NAME for uma string arbitrária, tem de incluir a flag --entry-point .
|
--entry-point ENTRY_POINT |
O nome de uma função ou classe no seu código-fonte. Opcional, a menos que não tenha usado FUNCTION_NAME
para especificar a função no código fonte a ser executada durante a implementação. Nesse caso, tem de usar --entry-point para indicar o nome da função executável.
|
--trigger-event NAME |
O nome do tipo de evento que a função quer receber. Neste caso, será uma das seguintes opções: escrever, criar, atualizar ou eliminar. |
--trigger-resource NAME |
O caminho da base de dados totalmente qualificado que a função vai ouvir.
Este deve estar em conformidade com o seguinte formato:
projects/_/instances/DATABASE_INSTANCE/refs/PATH .
|
--runtime RUNTIME |
O nome do tempo de execução que está a usar. Para ver uma lista completa, consulte a
gcloud referência.
|