如何使用云功能删除 Firestore 中的文档

Posted

技术标签:

【中文标题】如何使用云功能删除 Firestore 中的文档【英文标题】:How to delete a document in Firestore using cloud functions 【发布时间】:2021-02-13 07:25:22 【问题描述】:

我想检查在 Firestore 中创建的文档,以确保公开可见的字段中不包含脏话。在检测到该帖子包含脏话后,我希望能够删除该帖子。为此,我正在尝试使用 firebase 云功能:

// Package used to filter profanity
const badWordsFilter = require('bad words-list');

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Cloud Firestore.
const admin = require('firebase-admin');
admin.initializeApp();

export const filterBadWords =
  functions.firestore.document("posts/userId/userPosts/postId").onCreate((snapshot, context) => 
    const message = snapshot.data.val();

    // Check if post contains bad word
    if (containsSwearwords(message)) 
      //This is where I want to remove the post.
      //What do I put here to delete the document?
    
  )

// Returns true if the string contains swearwords.
function containsSwearwords(message: any) 
  return message !== badWordsFilter.clean(message);

数据库结构:

-posts(Collection)
   |
   +---userID (Document)
          |
          +---userPosts (collection)
                  |
                  +---Documents to be checked (Document)
                  |
                  +-Url1(field)
                  +-Url2(field)
                  +-string1(field)<- check this field for swear
                  +-string2(field)<- check this field for swear

云函数是使用 javascript 编写的

【问题讨论】:

现代版本的 firebase-functions 库不会将名为 event 的东西传递给 onCreate 函数的第一个参数。他们提供文档快照,如文档中所示。如果您使用的是旧版本,它真的旧了,您应该升级。 firebase.google.com/docs/functions/… 您使用的是 web、swift、objective-c、java android、kotlin/KTX android、java、python 还是 go? @Baby_Boy 我用的是swift,但是函数是用javascript写的 【参考方案1】:

这个答案会很短,但不需要解释。这是代码(对于 swift,我不是 100% 确定如何在 js 中执行此操作)

迅速:

db.collection("cities").document("DC").delete()  err in
    if let err = err 
        print("Error removing document: \(err)")
     else 
        print("Document successfully removed!")
    

这可能适用于 javascript,但不是 100% 确定

db.collection("cities").doc("DC").delete().then(function() 
    console.log("Document successfully deleted!");
).catch(function(error) 
    console.error("Error removing document: ", error);
);

希望对你有帮助

【讨论】:

【参考方案2】:

您可以使用ref 获取DocumentReference 并致电delete()

functions.firestore.document("posts/userId/userPosts/postId").onCreate(
  async (snapshot, context) => 
    const message = snapshot.data.val();

    // Check if post contains bad word
    if (containsSwearwords(message)) 
      await snapshot.ref.delete();
    
  
)

如果他们之后可以编辑他们的帖子,您应该概括此功能并将其添加到 onUpdate 触发器中

【讨论】:

这看起来像我要找的,但我收到错误 error Parsing error: Unexpected token snapshot snapshot 是您在onCreate 监听器中获得的属性 是的,我知道我拥有它,就像您拥有它一样。我现在正在排除故障。 没关系,缺少异步。现在工作。我会奖励赏金 @Bjorn 很高兴看到它有效。是的,我应该提到我在那里使用了async/await 模式:)

以上是关于如何使用云功能删除 Firestore 中的文档的主要内容,如果未能解决你的问题,请参考以下文章

使用云功能更新 Firestore 文档

云功能/Firestore。当字段位于不同文档中时如何触发

如何从云功能中移动 Firestore 文档?

如何使用云功能从 Firestore 中删除数据

使用云功能将文档复制到 Firestore 中的新集合中

如何使用 SwiftUI 中的 documentID 删除特定的 Cloud Firestore 文档?