【问题标题】:How can i convert my firebase realtime database function to firestore function如何将我的 firebase 实时数据库功能转换为 firestore 功能
【发布时间】:2020-10-26 08:25:59
【问题描述】:

我有一个我之前编写的有效的 firebase 实时数据库功能,但是当我将我的数据库从实时数据库更改为 firestore 时,它​​现在无法正常工作,我转换了一点,但我无法弄清楚如何转换 (.然后....)部分。我想做的是当用户状态字段在其文档中更改时,我希望该函数在firestore数据库中查询并查找状态字段也在等待的其他ppl文档并随机选择其中一个,然后更改其文档值如下例所示

这是原始firebase实时数据库功能的一部分,它是

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sayi = functions.database.ref("/users/{uid}/status").onWrite((change, context) => {
        console.log("status degisti");
        var rastgele = Math.floor(Math.random() * 2);
        var status = change.after.val();
        var user = change.after.ref.parent.key;  
        if (status ==="waiting") {
            const events = admin.database().ref('users');
            const query =events.orderByChild('status').equalTo('waiting').limitToFirst(2);
            query.on("value",
             function(data) {
                var waitinggameusers = data.val();
                var keys = Object.keys(waitinggameusers);
                for (var i = 0; i < keys.length; i++) {            
                    var key = keys[i];
                    if(key!==user){
                        var updates = {};
                        updates["/users/"+user+"/rakip"] = key;
                        updates["/users/"+key+"/rakip"] = user;
                        updates["/users/"+user+"/rakipsallama"] = "";
                        updates["/users/"+key+"/rakipsallama"] = "";
                        updates["/users/"+user+"/status"] = "on";
                        updates["/users/"+key+"/status"] = "on";
                        updates["/users/"+user+"/turn"] = "off1";
                        updates["/users/"+key+"/turn"] = "off2";                    
                        admin.database().ref().update(updates);
                        return true;
                    }             
                }
            }, sorunlu);
        }
    });

我当前的 Firestore 版本:

    const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

exports.yenisayi3 = functions.firestore.document('users/{userId}').onUpdate((change, context) => {
    const newValue = change.after.data();
    const previousValue = change.before.data();
    const userdoc = context.params.userId;
    if (newValue.status ==previousValue.status) {
        console.log("status degismedi");
        return true;
    }else{
        console.log("status degisti");
        var status = newValue.status;
        if(status==="off"||status==="on"||status==="win"){
            return false;
        }
        if (status ==="waiting") {
            return db.collection('users').where('status', '==', 'waiting').get().then(
                result=>{
                    if (result.docs.length === 0) {
                        return false;
                    }else{
                        return result.doc[0].ref.update({
                        status: 'on',
                        });
                    }
            });
        }
    }
});

目前我正在接受

TypeError: Cannot read property '0' of undefined
    at db.collection.where.get.then.result (/srv/index.js:31:24)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7) 

我的数据库布局是这样的:

【问题讨论】:

  • 您好@Faruk 确实,您可以使用where 来返回特定值。您能否看看这些案例herehere 并检查它们是否对您有帮助?它们提供了一些示例,说明如何使用 Cloud Function 更新 Firestore 中的文档。
  • 嗨加布里埃尔,感谢页面,虽然它很有用,但它并没有解决我所有的问题,我需要将结果限制为 1 个文档,它应该是随机的,目前它也给了我一个错误的错误已发布。

标签: javascript google-cloud-firestore google-cloud-functions


【解决方案1】:

你可能想要return result.docs[0].ref.update(),而不是return result.doc[0].ref.update()。你少了一个's'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2022-01-19
    • 1970-01-01
    • 2020-11-30
    • 2017-08-15
    • 2018-11-21
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多