【问题标题】:firebase cloud function not updating the datafirebase 云功能不更新数据
【发布时间】:2023-03-09 06:35:02
【问题描述】:

我有firebase实时数据库,它有用户节点并包含许多用户我想将用户的rating属性设置为0,首先我需要读取数据库并更新数据库。

我的函数正在读取数据但无法更新并在浏览器上返回{}

exports.quarter = functions.https.onRequest((req, res) => {
 let user1 = admin.database().ref('users/user1/userDetails').once('value');
 let user2 = admin.database().ref('users/user2/userDetails').once('value');
 let user3 = admin.database().ref('users/user3/userDetails').once('value');
 let user4 = admin.database().ref('users/user4/userDetails').once('value');
  Promise.all([user1, user2, user3, user4])
      .then(result => {
    let data = {};
     result[0].forEach(action => {
         data['users/user1/userDetails/' + action.key + '/' + 'Rating'] = 0;
     });
     result[1].forEach(action => {
         data['users/user2/userDetails/' + action.key + '/' + 'Rating'] = 0;
     });
    result[2].forEach(action => {
        data['users/user3/userDetails/' + action.key + '/' + 'Rating'] = 0;
    });
    result[3].forEach(action => {
        data['users/user4/userDetails/' + action.key + '/' + 'Rating'] = 0;
    });
     return data;

}).then(data => {
      console.log(data);
     return  admin.database().ref().update(data);

 }).then(data => {
     return res.send('done');

 }).catch(error => {
    return res.status(500).send(error);
 })
});

我可以看到console.log(data) 的结果,但函数没有更新,最后在执行get 请求后返回{}

这有什么问题?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    这行admin.database().ref().update(data)你的引用好像是undefined,看看docs

    我不确定您是否是指将您定义的 ref 保留在顶部

     let user1 = admin.database().ref('users/user1/userDetails').once('value');
    

    如果是这样的话..你必须像

     let user1 = admin.database().ref('users/user1/userDetails');
      user1.once('value')
    
     // and down where you want to update
     user1.update.(data)
    

    但请注意,这只是该节点的数据,如果您想使用您的方法,则不能一次全部更新

    【讨论】:

    • 那么如何获取对根节点的引用?
    • 不确定你所说的根节点是什么意思,users 可能吗?
    • 是的,但我想要users 的父级,我已将用户包含在数据变量中。
    • users 节点之外,它是 firebase 控制台中的项目名称。
    • 那么你需要引用你提到的那个节点,检查你在这里做什么例如let user1 = admin.database().ref('users/user1/userDetails')你正在定义路径'users/user1/userDetails',你必须为更新写作,基本上告诉保存在哪里
    【解决方案2】:

    Promise.all() 在传递给它的任何承诺完成之前返回。这意味着data 将是一个具有原始定义的空对象,并且该值会立即返回。相反,您应该使用以下 then 回调处理每个结果:

    exports.quarter = functions.https.onRequest((req, res) => {
     let user1 = admin.database().ref('users/user1/userDetails').once('value');
     let user2 = admin.database().ref('users/user2/userDetails').once('value');
     let user3 = admin.database().ref('users/user3/userDetails').once('value');
     let user4 = admin.database().ref('users/user4/userDetails').once('value');
     return Promise.all([user1, user2, user3, user4]);
    }).then(data => {
      // data will be an array of all the results. Handle them here.
     })
    });
    

    【讨论】:

      【解决方案3】:

      以下应该可以解决问题:

      exports.quarter = functions.https.onRequest((req, res) => {
        let user1 = admin
          .database()
          .ref('users/user1/userDetails')
          .once('value');
        let user2 = admin
          .database()
          .ref('users/user2/userDetails')
          .once('value');
        let user3 = admin
          .database()
          .ref('users/user3/userDetails')
          .once('value');
        let user4 = admin
          .database()
          .ref('users/user4/userDetails')
          .once('value');
      
        Promise.all([user1, user2, user3, user4])
          .then(result => {
            let data = {};
            result[0].forEach(action => {
              data['users/user1/userDetails/' + action.key + '/' + 'Rating'] = 0;
            });
            result[1].forEach(action => {
              data['users/user2/userDetails/' + action.key + '/' + 'Rating'] = 0;
            });
            result[2].forEach(action => {
              data['users/user3/userDetails/' + action.key + '/' + 'Rating'] = 0;
            });
            result[3].forEach(action => {
              data['users/user4/userDetails/' + action.key + '/' + 'Rating'] = 0;
            });
            console.log(data);
            return admin
              .database()
              .ref()
              .update(data);
          })
          .then(() => {
            return res.send('done');
          })
          .catch(error => {
            return res.status(500).send(error);
          });
      });
      

      【讨论】:

      • @rahulKushwaha 您有时间查看建议的解决方案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2021-09-07
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多