Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在firebase函数中的一个子函数上的写入触发器上从数据库读取任何数据?_Javascript_Firebase_Firebase Realtime Database_Google Cloud Functions - Fatal编程技术网

Javascript 如何在firebase函数中的一个子函数上的写入触发器上从数据库读取任何数据?

Javascript 如何在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

我已经在“pojo”节点上设置了触发器,每当发生一些更改时,它都会被触发。我可以访问其子级,但如何访问以下位置

此位置的值:

/XVBW8ED5DMTUEREYZYKP1GN2TO2/deviceToken


当触发数据库函数时,云函数从向下触发的点传入数据。要从数据库中的其他位置获取任何数据,需要在代码中读取这些数据

通过从
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
  • 使用AdminSDK,它已经包含在大多数示例中
  • 使用
    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();
      });
    
    }