Firebase onwrite函数仅更改一次值

时间:2017-06-21 17:43:16

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

我部署了一个简单的firebase功能,如下所示,我从谷歌开发人员那里学到了。其'简单的目的是每当有人将1111写入" value"数据库中的字段将其更改为某些文本但我的问题是此函数仅在创建数据字段时更改值一次,创建后它不执行任何操作,例如,如果用户输入1111则更改但是如果用户输入2222然后1111什么都没发生。我的代码应该改变什么?

提前致谢。

const functions = require('firebase-functions');

exports.sanitizePost=functions.database
    .ref('/users/{uid}')
    .onWrite(event =>{
        const post =event.data.val()
        if(post.sanitized){
            return
        }
        post.sanitized=true        
        post.value=sanitize(post.value)
        const promise = event.data.ref.set(post)
        return promise
    })
function sanitize(s){
    var sanitizedText = s
    sanitizedText = sanitizedText.replace("1111", "Congratz, you won!")
    return sanitizedText
}

还向我的java客户端添加了一个函数,该函数在数据库更改后将sanitized更改为false。

我的java类

import android.content.Context;
import android.widget.Toast;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import static com.facebook.FacebookSdk.getApplicationContext;


public class database{

    private DatabaseReference mDatabase;
    private FirebaseDatabase database;


    public void kullanicikontrol(String kullaniciadi,DatabaseReference mDatabase,String value){


        mDatabase.child("users").child(kullaniciadi).child("value").setValue(value);
        mDatabase.child("users").child(kullaniciadi).child("sanitized").setValue("false");


        Context context = getApplicationContext();
        CharSequence text = kullaniciadi;
        int duration = Toast.LENGTH_LONG;

        Toast toast = Toast.makeText(context, text, duration);
        toast.show();

    }
    public void kullanicikontrol(String kullaniciadi,DatabaseReference mDatabase){


        mDatabase.child("users").child(kullaniciadi).child("status").setValue("no");
    }
}

1 个答案:

答案 0 :(得分:2)

这很简单。你是

if(post.sanitized){
    return
}

然后设置:

post.sanitized=true   

因此,当您对帖子进行更改时,它已经被清理过,因此只是从第一个语句返回。

使其重新触发的最简单方法是删除该检查。 但这将导致不断重新触发,因为您正在编写数据,这将再次触发该功能。本质上是无限循环的云函数变体。使用这些类型的触发函数,确保对完成时间有明确的定义非常重要。

在这种情况下,您可以将“已完成”定义为:无法进行进一步的清理:

exports.sanitizePost=functions.database
.ref('/users/{uid}')
.onWrite(event =>{
    const post =event.data.val()
    const oldValue = post.value
    post.value=sanitize(post.value)
    if (post.value !== oldValue) {
        const promise = event.data.ref.set(post)
        return promise
    }
    else {
        return
    }
})