gpt4 book ai didi

angular - 如何在@angular/fire 7+ 中使用 collectionGroup

转载 作者:行者123 更新时间:2023-12-05 05:42:40 26 4
gpt4 key购买 nike

我会使用关键字做一个搜索表单,我可以用更古老的@angular/fire 版本来做,但不能用这个。

总是同样的错误:

FirebaseError : missing or insufficient permissions

我试图在我的 Angular 应用程序中实现一个 collectionGroup 新函数,但它显示了上面的错误。

然后我尝试创建一个 firebase 函数来返回我的 collectionGroup 但我不能重新使用该对象,因为它不是 @angular/fire,它纯粹是 firebase,对吗?

在我的组件中:

import {
collectionData,
collectionGroup,
DocumentData,
Firestore,
query,
where,
} from '@angular/fire/firestore';

search() {
if (this.searchForm.value.search.length) {
let substances = collectionGroup(this.afStore, 'substance');
// ERROR FirebaseError: Missing or insufficient permissions.
let query$ = query(
substances,
where('keywordsName', 'array-contains', this.searchForm.value.search)
);
let res = collectionData(query$);
let res$ = res.pipe(
map((families: DocumentData[]) => {
families.forEach((family: DocumentData) => {
family['color'] = this.riskReduction.generateRandomColor();
});
return families;
})
);
this.riskReduction.setSubstances(res$);
} else {
this.riskReduction.setSubstances(this.riskReduction.getSubstances());
}
}

编辑:否则我尝试使用该功能:

/**
* ANCHOR: Search a substance
*/

export const searchSubstance = functions.https.onCall(async (data, context) => {
try {
const ref = admin.firestore().collectionGroup('substance');
return <BasicResponse>{
status: 'success',
data: { substances: ref.get() },
};
} catch (e) {
console.log(e);
return <BasicResponse>{ status: 'error', message: e };
}
});

谢谢你的帮助

最佳答案

错误:

PERMISSION_DENIED:权限缺失或不足

意味着这个异常被抛出是因为 Firebase 服务器拒绝了操作,这可以通过更改 Cloud Firestore Security Rules 来解决。您可以尝试以下规则(仅用于测试):

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}

建议仅将这些规则用于测试目的,因为任何拥有您的项目 ID 的人都可以读取或写入。您可以实现多种安全措施,这里是 excellent article由 Alex Mamo(社区成员)提供,您可以使用它来实现其他几个更安全的安全规则。

第一次更新

由于我们正在从 collection group 中检索结果由集合组成,你需要使用recursive wildcard {name=**}

当使用递归通配符语法时,通配符变量将包含整个匹配路径段,即使文档位于深度嵌套的子集合中。例如,上面列出的规则将匹配位于 /cities/SF/landmarks/coit_tower 的文档,文档变量的值将是 SF/landmarks/coit_tower .

在安全规则的版本 2 中,递归通配符匹配零个或多个路径项。 match/cities/{city}/{document=**} 匹配任何子集合中的文档和 cities 集合中的文档。

您必须通过添加 rules_version = '2' 来选择加入版本 2;在您的安全规则的顶部:

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the cities collection as well as any document
// in a subcollection.
match /cities/{city}/{document=**} {
allow read, write: if <condition>;
}
}
}

每个匹配语句最多可以有一个递归通配符,但在版本 2 中,您可以将此通配符放在匹配语句中的任何位置。例如:

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the songs collection group
match /{path=**}/songs/{song} {
allow read, write: if <condition>;
}
}
}

我们可以通过实现 Firebase Admin SDK 来完全避免这个错误, 这个will bypass the security rules完全。

我也找到这个github theard这解释了如何通过执行以下操作避免出现此错误:

  1. 转到 IAM 和管理
  2. 选择左侧的“服务帐户”菜单
  3. 在“项目‘[项目名称]’的服务帐户”下,复制其名称列下具有“App Engine 默认服务帐户”的帐户的电子邮件(应为 [project_id]@appspot.gserviceaccount.com)。<
  4. 从左侧选择 IAM 菜单
  5. 点击最顶部的 +ADD(在“IAM”标题旁边)
  6. 在“新委托(delegate)人”字段中粘贴在第 3 点中复制的服务帐户电子邮件
  7. 选择“Firebase Admin SDK 管理员服务代理” Angular 色
  8. 点击保存。

关于angular - 如何在@angular/fire 7+ 中使用 collectionGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71980743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com