【问题标题】:Firebase onwrite function only changes values onceFirebase onwrite 函数只更改一次值
【发布时间】:2017-06-22 03:31:10
【问题描述】:

我部署了一个简单的 firebase 功能,如下所示,我从谷歌开发人员那里学到了这个功能。它的简单目的是每当有人将 1111 写入数据库中的“值”字段时,将其更改为一些文本,但我的问题是此函数仅在创建数据字段时更改值一次,创建后它什么也不做,例如,如果用户输入 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 客户端添加了一个函数,该函数在数据库更改后更改为 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");
    }
}

【问题讨论】:

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

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


【解决方案1】:

这很简单。你是

if(post.sanitized){
    return
}

然后设置:

post.sanitized=true   

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2019-08-10
    • 2018-03-28
    • 1970-01-01
    • 2018-05-04
    • 2017-12-22
    • 2019-02-11
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多