Javascript Firebase onwrite函数只更改一次值

Javascript Firebase onwrite函数只更改一次值,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我部署了一个简单的firebase函数,如下所示,这是我从google开发者那里学到的。它的简单用途是,每当有人将1111写入数据库中的“value”字段时,将其更改为一些文本,但我的问题是,该函数仅在创建数据字段时更改值一次,创建后它不会执行任何操作,例如,如果用户输入1111,它会更改,但如果用户输入2222,然后1111,则不会发生任何事情。我应该在代码中更改什么 提前谢谢 const functions = require('firebase-functions'); exports.

我部署了一个简单的firebase函数,如下所示,这是我从google开发者那里学到的。它的简单用途是,每当有人将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");
    }
}

这相当简单。你是

if(post.sanitized){
    return
}
然后设置:

post.sanitized=true   
因此,当您对post进行更改时,它已经被清除,因此只需从第一条语句返回

使其重新触发的最简单方法是删除该复选框但这将导致不断的重新触发,因为您正在写入数据,这将再次触发该函数。本质上,云函数是无限循环的变体。对于这些类型的触发函数,确保对何时完成有一个清晰的定义是非常重要的

在这种情况下,您可以将“完成”定义为:无需进一步消毒:

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
    }
})

这相当简单。你是

if(post.sanitized){
    return
}
然后设置:

post.sanitized=true   
因此,当您对post进行更改时,它已经被清除,因此只需从第一条语句返回

使其重新触发的最简单方法是删除该复选框但这将导致不断的重新触发,因为您正在写入数据,这将再次触发该函数。本质上,云函数是无限循环的变体。对于这些类型的触发函数,确保对何时完成有一个清晰的定义是非常重要的

在这种情况下,您可以将“完成”定义为:无需进一步消毒:

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
    }
})

发布对
value
sanitized
执行写入的客户端代码@BobSnyder添加了java代码。如果调用
mDatabase.child(“用户”).child(kullaniciadi.child(“sanitized”).setValue(“false”)
before
mDatabase.child(“用户”).child(kullaniciadi).child(“值”).setValue(值)?除非将值设置为“false”,否则函数似乎不会进行清理在触发之前。@JenPerson当我更改这些代码的位置时,sanitized false状态和值不会更改。发布在
value
sanitized
@BobSnyder上执行写入操作的客户端代码添加了java代码。如果调用
mDatabase.child(“用户”).child(kullaniciadi).child(“sanitized”),会发生什么.setValue(“假”)
before
mDatabase.child(“用户”).child(kullaniciadi).child(“值”).setValue(值)?除非在触发之前将值设置为“false”,否则该函数似乎不会进行清理。@JenPerson当我更改这些代码的位置时,已清理的false状态和值不会更改。