functions - firestore javascript
¿Cómo obtener el ID de usuario de un activador de base de datos en Cloud Functions for Firebase? (2)
Desde que las funciones de Firebase llegaron a la versión 1.0, este comportamiento ya no está indocumentado, pero ha cambiado ligeramente. Asegúrese de leer los documentos .
El contexto se ha agregado a las funciones de la nube y puedes usarlo así
exports.dbWrite = functions.database.ref(''/path/with/{id}'').onWrite((data, context) => {
const authVar = context.auth; // Auth information for the user.
const authType = context.authType; // Permissions level for the user.
const pathId = context.params.id; // The ID in the Path.
const eventId = context.eventId; // A unique event ID.
const timestamp = context.timestamp; // The timestamp at which the event happened.
const eventType = context.eventType; // The type of the event that triggered this function.
const resource = context.resource; // The resource which triggered the event.
// ...
});
En el ejemplo siguiente, ¿hay alguna forma de obtener el usuario del usuario que escribió en / messages / {pushId} / original?
exports.makeUppercase = functions.database.ref(''/messages/{pushId}/original'')
.onWrite(event => {
// Grab the current value of what was written to the Realtime Database.
const original = event.data.val();
console.log(''Uppercasing'', event.params.pushId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing asynchronous tasks inside a Functions such as
// writing to the Firebase Realtime Database.
// Setting an "uppercase" sibling in the Realtime Database returns a Promise.
return event.data.ref.parent.child(''uppercase'').set(uppercase);
});
Sí, esto es técnicamente posible, aunque actualmente no está documentado. El uid
se almacena con el objeto event.auth
. Cuando se activa una función de nube de base de datos desde una situación de administrador (por ejemplo, desde el visor de datos de Firebase Console o desde un SDK de administrador), el valor de event.auth
es:
{
"admin": true
}
Cuando se desencadena una función de nube de base de datos a partir de una referencia no autenticada, el valor de event.data
es:
{
"admin": false
}
Y finalmente, cuando se activa una función de nube de base de datos desde una referencia autorizada, pero no administrativa, el formato de event.auth
es:
{
"admin": false,
"variable": {
"provider": "<PROVIDER>",
"provider_id": "<PROVIDER>",
"user_id": "<UID>",
"token": {
// Decoded auth token claims such as sub, aud, iat, exp, etc.
},
"uid": "<UID>"
}
}
Dada la información anterior, su mejor opción para obtener el usuario del usuario que activó el evento es hacer lo siguiente:
exports.someFunction = functions.database.ref(''/some/path'')
.onWrite(event => {
var isAdmin = event.auth.admin;
var uid = event.auth.variable ? event.auth.variable.uid : null;
// ...
});
Solo tenga en cuenta que en el código anterior, uid
sería null
incluso si isAdmin
es true
. Su código exacto depende de su caso de uso.
ADVERTENCIA: Este es un comportamiento actualmente no documentado, por lo que daré mi advertencia habitual de que "las características no documentadas pueden modificarse en cualquier momento en el futuro sin previo aviso e incluso en versiones no importantes".