Javascript 如何在firebase函数中的一个子函数上的写入触发器上从数据库读取任何数据?
我已经在“pojo”节点上设置了触发器,每当发生一些更改时,它都会被触发。我可以访问其子级,但如何访问以下位置 此位置的值: /XVBW8ED5DMTUEREYZYKP1GN2TO2/deviceTokenJavascript 如何在firebase函数中的一个子函数上的写入触发器上从数据库读取任何数据?,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我已经在“pojo”节点上设置了触发器,每当发生一些更改时,它都会被触发。我可以访问其子级,但如何访问以下位置 此位置的值: /XVBW8ED5DMTUEREYZYKP1GN2TO2/deviceToken 当触发数据库函数时,云函数从向下触发的点传入数据。要从数据库中的其他位置获取任何数据,需要在代码中读取这些数据 通过从event.data.ref 因此,如果您有一个兄弟姐妹admin: const functions = require('firebase-functions'); con
当触发数据库函数时,云函数从向下触发的点传入数据。要从数据库中的其他位置获取任何数据,需要在代码中读取这些数据 通过从
event.data.ref
因此,如果您有一个兄弟姐妹admin
:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.ok=functions.database.ref("/{uid}/messages/{key}/pojo")
.onWrite(event =>{
var snap = event.data;
return snap.ref.parent.child("admin").once("value").then((adminSnapshot) {
var adminVal = adminSnapshot.val();
// TODO: do something with the adminVal and return a value or a promise
});
}
要从完全不相关的路径读取值,有两个选项:
event.data.ref.root
或event.data.adminRef.root
event.data.ref.root
或event.data.adminRef.root
您还可以使用event.data.ref.root
或event.data.adminRef.root
从根目录开始构建路径。这两个选项之间的区别在于event.data.ref
具有与触发函数的用户相同的访问权限,而event.data.adminRef
具有对整个数据库的完全访问权限
一个简单的例子是,假设您有一个要访问的全局admin
节点:
exports.ok=functions.database.ref("/{uid}/messages/{key}/pojo")
.onWrite(event =>{
var root = event.data.ref.root;
return root.child("admin").once("value").then((adminSnapshot) {
var adminVal = adminSnapshot.val();
// TODO: do something with the adminVal and return a value or a promise
});
}
使用AdminSDK,它已经包含在大多数示例中。
或者,您可以从Admin SDK开始,它已经包含在您的代码段中:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.ok=functions.database.ref("/{uid}/messages/{key}/pojo")
.onWrite(event =>{
var snap = event.data;
admin.database().ref('XVbW8ED5DmTUerEYZZykp1GN2TO2/deviceToken').once("value").then(function(tokenSnapshot) {
var deviceToken = tokenSnapshot.val();
});
}
另见
最后一种方法也适用于其他触发器类型,例如HTTP触发函数。由于这些函数不能获取
event.data.ref
,因此管理员SDK是您在这里的唯一选项。我想要'/xvbw8ed5dmtuereyzykpkp1gn2to2/deviceToken'的值。我也为此添加了一个片段。我们是否必须返回“admin.database().ref('xvbw8ed5dmtuereyzykp1gn2to2/deviceToken')。一次(“值”)。然后((tokenSnapshot){var-deviceToken=tokenSnapshot.val();});返回admin.database().ref('xvbw8ed5dmtuereyzykp1gn2to2/deviceToken')。一次(“值”)。然后((tokenSnapshot){var-deviceToken=tokenSnapshot.val();});我认为您在读取deviceToken的代码段中遗漏了键工作“function”。它应该是admin.database().ref('xvbw8ed5dmtuereyzyzykp1gn2to2/deviceToken')。一次(“value”)。然后(function(tokenSnapshot){var-deviceToken=tokenSnapshot.val();});
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.ok=functions.database.ref("/{uid}/messages/{key}/pojo")
.onWrite(event =>{
var snap = event.data;
admin.database().ref('XVbW8ED5DmTUerEYZZykp1GN2TO2/deviceToken').once("value").then(function(tokenSnapshot) {
var deviceToken = tokenSnapshot.val();
});
}