@ dedgedev/ firebase (英语)
Vue 3 / Nuxt 3 插件或 Nuxt 3 的全局堆肥,用于 Firebase 认证和 Firestore .
目录
安装
用户管理和收藏权限
Firebase 验证
Firestore 基本文档交互
快照监听器
Firestore 静态采集数据
运行云函数
边缘监视器出错报告
等待和回应
消防车规则
在潜入文档之前,重要的是要注意,当使用这个包时,你应该总是使用 await 或等待承诺解决。 这确保规则助手的工作正确,并为核实用户访问权提供必要的信息。 不等待承诺可能导致访问控制中的不一致以及您的应用程序中的出乎意料的行为. 有关该类如何处理用户权限的更多信息,请参见下一节: 规则助手:管理 Firestore 中的用户权限。 。 。 .
安装
使用 pnpm 安装 :
pnpm install @edgedev/firebase
KV 所有权和推出
共享边缘供应消费者 functions/kv/ 执行。 这个包
2026年5月停止复制这些文件,不再将已经过时的文件捆绑
src/kv/ 副本。 安装此软件包不会创建、更新或删除
消费者的 KV 文件; 通过 Edge 更新工作流程提供这些文件
装入或部署函数,包括在新安装上.
两个Firebase索引模板不再需要或导出 kvMirrorRetryWorker。 。 。 .
升级时,邮站取代了Firebase管理的标记块,去除其
保留单独的 EXTRA EDGE functions 块.
Edge现在拥有执行和职能登记.
更新每个消费者的边缘 在安装此已清理的软件包之前编辑
边际迁移必须把不变的平面出口置于管理区块内
消费者的 functions/index.js数字 :
// START EXTRA EDGE functions
exports.kvMirrorRetryWorker = require('./kv/kvRetryWorker').kvMirrorRetryWorker
// END EXTRA EDGE functions
Edge 更新工作流程也必须去除已知遗留的 KV 注册行 仅在Firebase管理区块内,并在包后重新出现Edge区块 安装,因此旧的Firebase包无法恢复重复的注册. 保持已部署的函数名称和触发设置不变 。 检查每个 消费者在部署前有Edge KV文件和Edge注册. 在迁移之前安装此软件包会删除遗留的导出, 而无需 提供替换.
在释放清理之前,运行 npm test,验证包的内容排除
src/kv/,并证实目标消费者已经接受了边缘迁移。 这个
软件包版本是 26.10.2出版、消费者最新情况和部署
是单独的步骤;共享的 KV 重试有效载荷固定器属于边缘而不是
包括在这里.
用户同步
版本 26.10.2 保留原始登记合同并弥补缺失
userId 种族。 每个镜像写入包含目的文件 ID 和使用
set(..., { mergeFields: Object.keys(userUpdate) })顶层
地图,同时保留不相关的字段。 不需要邀请核准记录.
这将删除在
26.10.1;不要将该版本用于现有的CMS/Hub消费者.
安装 26.10.2 在函数所有者和部署中 edgeFirebase-updateUser。 。 。 .
仅靠前端依赖更新并不能更新已部署的功能.
缺少现有账户 userId 需要它的下个镜像同步或单独的
经核实的身份修复。 镜像还对照信任,检查客户角色/特殊许可更新
users 权限、 保存配置编辑、 自删除和授权管理员
任务。 CMS/Admin SDK服务账号保留了他们现有的行为.
不包括任何组织统一或可登记更改.
updateUser 现在使用 onDocumentUpdatedWithAuthContext 以区分服务
账户来自客户端写作。 它的触发事件类型变化; 替换
现有 edgeFirebase-updateUser 启动时触发,而不是假设
支持现场事件类型的更新。 软件包未添加新导出
函数或注册步骤。 没有构建、出版、消费者更新或部署
由这些测试进行。 这是一种有针对性的注册用户角色检查,而不是
对邀请/模拟创建或每个中继数据消费者进行全面审计.
运行 npm test。对于本地 Firestore 读取实际处理器,运行:
USER_SYNC_FIRESTORE_SDK=/absolute/path/to/@google-cloud/firestore/build/src/index.js node scripts/test-user-sync.cjs
登录审计日志
可在根中审计明确的登录尝试 login-log 藏书,
包括试图的电子邮件/电话、安全错误细节、时间戳和应用程序
权限失败。 记录在60天后过期 一旦启用 Firestore TTL。 。 。 .
见 登录审计设置和查询 用于所需职能,
规则、索引和TTL的推出、根-admin访问和提交限制.
安装 Nuxt 3 个全局堆肥
在您的“ 组合” 文件夹中添加一个文件( 例如, 无论什么. ts)
import { EdgeFirebase } from "@edgedev/firebase";
const config = {
apiKey: "your-apiKey",
authDomain: "your-authDomain",
projectId: "your-projectId",
storageBucket: "your-storageBucket",
messagingSenderId: "your-messagingSenderId",
appId: "your-appId",
emulatorAuth: "", // Local emulator port for auth emulator
emulatorFirestore: "", // Local emulator port for Firestore emulator
emulatorFunctions: "", // Local emulator port for functions emulator, used to test Cloud Functions locally.
};
const isPersistant = true // If "persistence" is true, login will be saved locally, they can close their browser and when they open they will be logged in automatically. If "persistence" is false login saved only for the session.
const edgeFirebase = new EdgeFirebase(config, isPersistant);
export { edgeFirebase };
* Nuxt 必须配置已禁用 SSR, 更新 nuxt. config.ts 文件( 如果您的工程 SSR 其他部分, 请参见 Nuxt 3 插件插件插件插件 ):
export default defineNuxtConfig({ ssr: false });
作为插件安装
Vue 3 插件, 主例. js :
import { createApp } from "vue";
import App from "./App.vue";
// EdgeFirebase Plugin
import eFb from "@edgedev/firebase";
const isPersistant = true // If "persistence" is true, login will be saved locally, they can close their browser and when they open they will be logged in automatically. If "persistence" is false, login saved only for the session.
app.use(eFb, {
apiKey: "your-apiKey",
authDomain: "your-authDomain",
projectId: "your-projectId",
storageBucket: "your-storageBucket",
messagingSenderId: "your-messagingSenderId",
appId: "your-appId",
emulatorAuth: "", // Local emulator port for auth emulator
emulatorFirestore: "", // Local emulator port for Firestore emulator
emulatorFunctions: "", // Local emulator port for functions emulator, used to test Cloud Functions locally.
}, isPersistant)
// End edgeFirebase
app.mount("#app");
使用插件文件夹的 Nuxt 3 示例 :
在您的“ 插件” 文件夹中添加一个文件( 例如, 随便. client. ts), 代码如下 :
- 注意文件名中的". 客户" 如果文件中没有名称, 您必须在 Nuxt 配置中禁用 SSR .
import eFb from "@edgedev/firebase";
const isPersistant = true // If "persistence" is true, login will be saved locally, they can close their browser and when they open they will be logged in automatically. If "persistence" is false, login saved only for the session.
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(eFb, {
apiKey: "your-apiKey",
authDomain: "your-authDomain",
projectId: "your-projectId",
storageBucket: "your-storageBucket",
messagingSenderId: "your-messagingSenderId",
appId: "your-appId",
emulatorAuth: "", // Local emulator port for auth emulator
emulatorFirestore: "", // Local emulator port for Firestore emulator
}, isPersistant);
});
- 或者,您可以禁用整个 Nuxt 工程的 SSR , 而不是用 ". client" 命名插件, 更新 nuxt. config.ts 文件 :
export default defineNuxtConfig({ ssr: false });
在作为插件安装后, 将此包含在您想要使用 EdgeFirebase 的任何组件中的“ 字符设置 ” 中 :
<script setup>
import { inject } from "vue";
const edgeFirebase = inject("edgeFirebase");
</script>
边缘监视器出错报告
浏览器错误报告默认已禁用 。 启用每个工程
过 errorReporting.enabled: true 创建时 EdgeFirebase. 项目
必须在 Edge 监视器中首先注册允许使用的每个主机名
报告。 软件包然后直接从
边缘监视器; 没有监视器密钥被运入浏览器 .
浏览器记者捕捉未发现的 JavaScript 错误, 未处理的承诺
拒绝, 失败的脚本/ 图像/ 风格资源, 当软件包是时 Vue 出错
安装于 app.use(), (中文(简体) ), console.error,一个封顶样本
console.warn失败 runFunction() 打电话 它从不送饼干 Auth
符号、窗体值、本地存储、可调用参数、 DOM 文本或任意
控制台对象。 报告页面和资源 URL 没有查询字符串或
大麻碎片.
也可以向当地的边际监测工作者报告:
const edgeFirebase = new EdgeFirebase({
...config,
errorReporting: {
enabled: true,
monitorUrl: "http://localhost:8787",
captureConsoleWarnings: false,
},
}, true)
对于创建于
套件安装输出的触发工厂 functions/config.js, (中文(简体) ),
包括可调用、HTTP、Firestore、Pub/Sub、调度器和存储触发器.
原错误总是重推, 所以 Firebase 重试和失败语义
不变.
将边缘监视器返回的特定项目的密钥添加到已部署的 函数环境:
EDGE_ERROR_REPORTING=true
EDGE_ERROR_INGEST_KEY=project-specific-key-from-edge-monitor
EDGE_ERROR_ENVIRONMENT=production
EDGE_RELEASE=
EDGE_ERROR_INGEST_KEY 只有服务器。 永远不要把它添加到一个 Nuxt/Vite 公众
环境变量。 函数报告只包含项目、函数、,
触发器,区域,稳定事件ID 当Firebase提供1, 并消毒
错误名称/代码/消息/tack. Firestore 文档、 Pub/ Sub 信件、 HTTP
不包括机构、可调用数据和认证上下文.
Firebase触发函数.
这些函数响应于 staged-users 火炉集. 这个触发器旨在帮助保持数据一致性 staged-users 财务报告和审定财务报表 users 藏书. 当文档在 staged-users 收集更新,触发器执行检查并更新 users ,确保两集保持同步.
触发因素考虑了各种情况,如存在一种或多种情况 userId 字段,新旧差异 templateUserId 字段,以及事件处理状态。 它使用帮助函数,如 setUser, (中文(简体) ), shouldProcess,以及 markProcessed 管理这些设想方案,并对 users 藏书。 这些功能处理诸如更新或创建用户文档,检查是否要处理一个事件,以及将一个事件标记为已处理的事件等任务.
从本质上讲 updateUser 触发通过自动同步更新来简化用户数据管理 staged-users 财务报告和审定财务报表 users 在您的 Firebase 项目中添加收藏, 并添加另一层安全 .
用户管理需要在您的 Firebase 函数中设置 Firestore 触发函数和帮助器函数 。 这些功能自动被添加到您项目中的函数/index.js中,被"//START @dedge/firebase函数"和"///END @dedge/firebase函数"所包裹.
const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()
const db = admin.firestore()
// START @edge/firebase functions
.......
// END @edge/firebase functions
为了确保您的工程安全, 请安装此文档末尾提供的 Firestore 规则文档 .
用户管理和收藏权限
添加用户
在登录和密码注册之前,必须添加用户或"Template Users"(需要手动添加第一个项目用户,参见下" Root权限和第一个用户"部分). 在添加用户时,可以传递角色和/或特殊权限和用户元数据. 关于角色和特殊权限的更多解释,见下文.
添加用户在收藏"阶段用户"中为他们创建了文档. 本文的docId作为注册代码使用,使用"注册用户"时必须经过"注册代码"变量.
收集"阶段用户"是用于所有修改的中转区,可以使"用户"收集中的实际用户进行消毒. 用户注册后,其舞台用户会与其"用户"用户相接. 一般来说,"用户"收藏中的用户不应被修改. 事实上,如果采用本文档所显示的火炬规则,则不允许直接修改"用户"收藏中的用户. 本包中所有与用户相关的功能(编辑元,设置规则和特殊权限,列出用户)在"阶段用户"收藏上完成.
要绕过添加用户并允许"自注册",可以通过设置字段"isTemplate"=真字来添加一个属于"Template User"的用户. 对于模板用户,也可以设置动态文档生成,并通过设置"subCreate"来指定已注册的用户对该文档起指定的作用. 然后,在注册用户时,可以通过"动态Document FieldValue"变量. 在下面的例子中,如果您在注册时通过: 动态文档 FieldValue = “我的新组织 ” , 将在我的项目下创建这样的文件 : {名称: “我的新组织 ” 。 该用户还将被指派担任新创建的文件的管理员。 如果您的项目将完全实现自我注册,您可以创建一个"Template User"和硬码,将注册ID写入您的注册程序.
如何添加用户 :
edgeFirebase.addUser({
roles: [
{
collectionPath: "myItems/subitems/things",
role: "user"
}
],
specialPermissions: [
{
collectionPath: "otherthings",
permissions: { assign: false, write: true, read: true, delete: false}
}
],
meta: { firstName: "John", lastName: "Doe", age: 28 } // This is just an example of meta, it can contain any fields and any number of fields.
isTemplate: true, // Optional - Only true if setting up template for self registation
subCreate: {
rootPath: 'myItems',
role: 'admin',
dynamicDocumentFieldValue: 'name',
documentStructure: {
name: '',
},
}
});
interface newUser {
roles: role[];
specialPermissions: specialPermission[];
meta: object;
isTemplate?: boolean;
subCreate?: {
rootPath: string, // This must be a collection path (odd number of segments) since a document will be created and assigned to ther user here.
role: string, // must be admin, editor, writer, user
dynamicDocumentField: string, // This is the field in the document that will be set by the value of "dynamicDocumentFieldValue" passed during registration, like "name"
documentStructure: {
[key: string]: any
}
};
}
注册用户
在某人被添加为用户后,他们需要"自我注册"开始使用该系统. 只有已经由拥有指定权限的人添加的用户才能注册. 该功能还检查以确保它们还没有注册.
edgeFirebase.registerUser({
email: "[email protected]",
password: "Password1234",
meta: {
firstName: "John",
lastName: "Doe"
}, // This is just an example of meta, it can contain any fields and any number of fields.
registrationCode: (document id), // This is the document id of either an added user or a template user, when using a template you can simply hardcode the registrationCode of the remplate to allow self registration.
dynamicDocumentFieldValue: "" // Optional - See explaintion above about self registration and dynamic collectionPath for user roles.
});
interface userRegister {
email?: string;
password?: string;
meta: object;
registrationCode: string;
dynamicDocumentFieldValue?: string;
}
使用微软提供商注册.
调用此选项将生成一个 Microsoft Sign In Popup 并使用 Microsoft 证书注册用户 .
edgeFirebase.registerUser(
{
meta: {
firstName: "John",
lastName: "Doe"
}, // This is just an example of meta, it can contain any fields and any number of fields.
registrationCode: (document id), // This is the document id of either an added user or a template user, when using a template you can simply hardcode the registrationCode of the remplate to allow self registration.
dynamicDocumentFieldValue: "" // Optional - See explaintion above about self registration and dynamic collectionPath for user roles.
},
'microsoft', // This is the authProvider only 'email' or 'microsoft' are supported, default is 'email',
["mail.read", "calendars.read"] // This is a list of scopes to pass to Microsoft, the field is optional.
);
邀请现有用户向新组织或成员登记
请现有用户在新组织或成员的数据中登记,并获得相应的作用 edgeFirebase.currentUserRegister(userRegister) 方法.
const userRegisterData = {
registrationCode: "12345",
dynamicDocumentFieldValue: "fieldName",
};
const response = await edgeFirebase.currentUserRegister(userRegisterData);
参数
userRegister(对象):包含用户注册数据的对象. 它必须包括registrationCode由邀请组织或成员提供的财产。 还可包括:dynamicDocumentFieldValue属性,表示用于注册的附加数据字段名称.
interface userRegister {
registrationCode: string;
dynamicDocumentFieldValue?: string;
}
回返
方法返回一个承诺 解决到一个 actionResponse 对象 :
interface actionResponse {
success: boolean;
message: string;
meta: {};
}
示例用法:
<script setup>
async function inviteExistingUser() {
const userRegisterData = {
registrationCode: "12345",
dynamicDocumentFieldValue: "fieldName",
};
const response = await edgeFirebase.currentUserRegister(userRegisterData);
if (response.success) {
console.log("Existing user invited and registered successfully");
} else {
console.error("Error inviting and registering existing user:", response.message);
}
}
</script>
许可的解释
- 指定:布尔 - 当用户拥有收藏的许可时,他们可以指派其他用户参加收藏,并更改收藏的许可。 要让用户能够运行设置用户、存储库、存储用户记录、删除用户记录、存储用户特殊记录或删除用户特殊记录,他们必须能够指定访问这些功能中传入的任何收集路径.
- 写:布尔 - 允许用户将文档写入收藏
- 读取:布尔 - 允许用户在收藏中阅读文档
- 删除:布尔 - 允许用户删除收藏中的文档
按角色分列的收藏权限
角色定义用户的权限 。 系统将使用收集-数据/-默认-来查询指定角色的权限. 默认权限可以被更改,也可以根据特定的收藏路径定义角色权限. 如果在查找用户角色权限时找不到特定的收藏路径
- 管理员 : 指定:正,写:正,读:正,删:正
- 编辑器:指定:虚假,写出:真实,读出:真实,删除:真实
- 编剧:指定:虚假,写出:真实,读出:真实,删除:虚假
- 用户 : 指定:假,写:假,写:真,删:假
如何更改特定收藏的角色权限 :
edgeFirebase.storeCollectionPermissions(
"myItems/subitems/things", // Collection path
"user", // must be admin, editor, writer, user
{
assign: false,
write: false,
read: true,
delete: false
}
);
删除收藏权限 。 这样做是为了在收藏路径被删除时"清理".
edgeFirebase.removeCollectionPermissions(
"myItems/subitems/things")
收藏的用户角色
用户根据收集路径分配角色. 由有子集的收藏路径指定的角色,也会决定用户在所有子集上能做什么,或者用户只能被指定一个子集的作用. 例如,如果一个用户被指派作为“我的项目/分项目/事物”的管理员,他们只能访问该收藏。 但如果用户被指派为“我的项目”的管理员,他们将拥有“我的项目”和“我的项目”所有子集的管理员权限.
如何为收藏指定一个用户的角色 :
edgeFirebase.storeUserRoles(
docId, //Document ID of user in staged-users collection.
"myItems/subitems/things",
"admin"
);
删除收藏用户的角色 :
edgeFirebase.removeUserRoles(
docId, //Document ID of user in staged-users collection.
"myItems/subitems/things"
);
根权限和第一个用户
您可以通过在"-"上给用户一个角色来指定用户访问整个工程中的所有收藏,这个角色用于定义根收藏路径. 这将是一个像超级管理员的人。 如果这是您的第一个用户, 您需要手动在“ 阶段用户” 内的 Firstore 控制台设置 。 一旦一个根用户被手动添加,您需要"注册"该用户使用"已升级用户"的docId作为注册代码,请参见此文档的用户注册部分. 您可以使用该用户添加其他"root user",或者设置其他的集合并指派角色给他们. 您还需要手动创建收藏数据/-default-角色权限文档(见上文)和根权限文档,请参见以下示例:



用户特殊权限
如果您想要给一个用户一个无法匹配该收藏的管理员或用户角色的收藏独有的一组权限,可以设置"特别权限".
edgeFirebase.storeUserSpecialPermissions(
docId, //Document ID of user in staged-users collection.
"myItems/subitems/things",
{
assign: false,
write: true,
read: true,
delete: true
}
);
删除用户特殊权限 :
edgeFirebase.removeUserSpecialPermissions(
docId, //Document ID of user in staged-users collection.
"myItems/subitems/things"
);
规则助手:管理 Firestore 中的用户权限
该软件包提供了一个工具,旨在协助管理用户对您 Firestore 项目中各种动作的权限。 通过服用 collectionPath 还有一个 action 作为输入参数,它确定用户的作用和特殊权限,并保存一个 RuleCheck 对象 rule-helpers 藏书.
这个 RuleCheck 对象包含权限类型,权限检查路径,完整路径,以及动作,提供必要的信息来验证用户的访问权限. 通过通过用户的角色和特殊权限来活化,该类识别正确的权限检查路径和类型.
该类在维护数据安全和您Firestore项目中的访问控制方面发挥着至关重要的作用. 它确保用户只能根据其角色和特殊权限执行他们被授权的行动.
删除用户
删除用户功能实际上不会将用户完全从系统中删除,而是去除运行该功能的用户已经指定访问权限的所有角色和特殊权限. 这样,就"指定用户"而言,用户会被"删除",但用户仍将是"指定用户"无法访问的集合的用户.
edgeFirebase.removeUser(docId);
删除自己
此功能允许用户删除自己的账户. 它会从两个版本中删除用户的文档 users 财务报告和审定财务报表 staged-users 数据库中的收藏,并删除用户的认证记录. 函数返回一个 actionResponse 显示操作成败的对象.
使用量
要删除当前用户的账户,请拨打 deleteSelf 函数 :
const response = await edgeFirebase.deleteSelf();
if (response.success) {
console.log("Account deleted successfully.");
} else {
console.log("Failed to delete account:", response.message);
}
用户快照数据
这将创建一个反应对象(state.users),其中包含被传递到快照的集合成员,如果运行该函数的用户已经指定了访问权限,它将是一个由docId列出的索引.
edgeFirebase.startUsersSnapshot("myItems");
// Stop users snapshot:
edgeFirebase.stopUsersSnapshot();
<script setup>
console.log(edgeFirebase.state.users);
</script>
<template>
<div>
<div v-for="user in edgeFirebase.state.users" :key="item">
{{ user.meta.name }}
</div>
</div>
</template>
interface user {
docId: string;
roles: role[];
specialPermissions: specialPermission[];
userId: string;
uid: string;
}
interface role {
collectionPath: "-" | string; // - is root
role: "admin" | "editor" | "writer" | "user";
}
interface specialPermission {
collectionPath: "-" | string; // - is root
permissions: permissions;
}
interface permissions {
assign: boolean;
read: boolean;
write: boolean;
delete: boolean;
}
Firebase 验证
电子邮件和密码登录 :
edgeFirebase.logIn(
{
email: "[email protected]",
password: "pasword"
}
);
与微软登录
此功能允许用户登录使用他们的微软账户. 如果您想要向用户请求额外权限,也可以指定一个提供者范围。 该函数返回一个承诺, 承诺将在签名进程完成后解决 。 如果用户不存在,则会触发出错并登录用户出局.
使用量
要登录微软账户,请联系 logInWithMicrosoft 函数。 也可以通过一系列提供者范围作为可选参数.
// Log in using Microsoft account without additional provider scopes
edgeFirebase.logInWithMicrosoft();
// Log in using Microsoft account with additional provider scopes
const providerScopes = ["User.Read", "Calendars.Read"];
edgeFirebase.logInWithMicrosoft(providerScopes);
参数
providerScopes(可选) : 一组字符串代表额外的提供者范围,可以向用户请求。 默认为空数组.
回返
承诺在签入过程完成后解决. "承诺"决定无效,但在签入过程中发生的任何错误都会被记录并存储在 this.user.logInError 财务报告和审定财务报表 this.user.logInErrorMessage 属性.
登录后,用户信息包含在: 边缘Firebase.user中
用户对象具有反应性并包含这些项:
interface UserDataObject {
uid: string | null;
email: string;
firebaseUser: object; // contains the entire auth from firebase
oAuthCredential: object; // contains oAuth ID and token information
loggedIn: boolean;
loggingIn: boolean: // true while logging in used for loading screens
logInError: boolean;
logInErrorMessage: string;
meta: object;
roles: role[]; //see role below
specialPermissions: specialPermission[]; //see specialPermission below
}
// sub types of UserDataObject:
interface role {
collectionPath: "-" | string; // - is root
role: "admin" | "editor" | "writer" | "user";
}
interface specialPermission {
collectionPath: "-" | string; // - is root
permissions: permissions; // see permissions below
}
interface permissions {
assign: boolean;
read: boolean;
write: boolean;
delete: boolean;
}
反应性项目 (原始内容存档于2018-10-21) (英语). firebase.user. loged 单位 可以在代码或模板中用于确定用户是否登录.
边缘 Firebase.user.logginIn 在用户登录时为真实。 这可用于显示装入屏幕 .
如果有错误登录, 边缘 Firebase.user.log 错误 将会是真的,而且 边缘 Firebase.user.log 错误 可用于将错误还给用户.
登入后, 边缘Firebase.logOut 成为可用。 登录也会自动断开所有 FireStore 听器 .
以下是使用登录的样本组件 :
<template>
<div>
<div v-if="edgeFirebase.user.loggedIn">
<button @click="edgeFirebase.logOut">Logout</button><br />
<ShowThings v-if="edgeFirebase.user.loggedIn" />
</div>
<div v-else>
<input v-model="email" style="width: 400px" type="text" /><br />
<input v-model="password" style="width: 400px" type="text" /><br />
<button @click="login">Login</button><br />
<div v-if="edgeFirebase.user.logInError">
{{ edgeFirebase.user.logInErrorMessage }}
</div>
</div>
</div>
</template>
<script setup>
const email = ref("");
const password = ref("");
const login = () => {
edgeFirebase.logIn(
{
email: email.value,
password: password.value
},
true
);
};
</script>
更新用户电子邮件
要更新当前认证用户的电子邮件地址,请使用 edgeFirebase.updateEmail(newEmail) 方法.
const response = await edgeFirebase.updateEmail("[email protected]");
参数
newEmail(字符串):为用户设置的新电子邮件地址.
回返
方法返回一个承诺 解决到一个 actionResponse 对象 :
interface actionResponse {
success: boolean;
message: string;
meta: {};
}
示例用法:
<script setup>
async function changeEmail() {
const newEmail = "[email protected]";
const response = await edgeFirebase.updateEmail(newEmail);
if (response.success) {
console.log("Email updated successfully");
} else {
console.error("Error updating email:", response.message);
}
}
</script>
更改密码 :
此功能允许用户在登录时更改当前密码 :
edgeFirebase.setPassword("old-password", "new-password");
密码重置 :
对于未登录的用户( 如被遗忘的密码) 。 如果项目设置将密码重置为自定义密码重置页面,则此进程为两步进程.
步骤1:
edgeFirebase.sendPasswordReset('[email protected]');
步骤2: (如果密码重定向被设置到自定义页面,则需要从查询字符串中取出"oobCode"并连同新的密码一起通过. )
edgeFirebase.passwordReset('NewPassword123','AAaaAABaaaaAAABBBaaaBBBBAaaaaBABAbbaa');
更新用户元 :
用户登录时可以更新自己的元数据. 包含元数据的对象只会更新/添加对象所传递的密钥.
edgeFirebase.setUserMeta({ lastName: "Smith" });
Firestore 基本文档交互
添加/更新文档
添加和更新文档都使用相同的函数: 边缘 Firebase.storeDoc(CollectionPath,对象)。要更新文档,对象必须包含密钥 医生,且值必须与正在更新的收藏中文档的ID相匹配 (注:所有通过边缘Firebase函数返回的文档,都会在文档对象中插入 docId)如果对象不包含 docId 或 DocId 在收藏中不匹配文档,则将创建一个新文档.
<script setup>
const addItem = {title: "Cool Thing"};
edgeFirebase.storeDoc("myItems", addItem);
</script>
注意: 当文档被写入收藏时, 添加了几个其他可以引用的密钥 : doc 已创建 at (博士创建的时间戳), 上次更新( n) (上次写的时间戳文档), 用户 (更新或创建文档的用户的用户id).
更新文档字段
相对于 storeDoc 方法,用于添加或更新整个文档,可以使用 edgeFirebase.changeDoc(collectionPath, docId, object) 在文档中更新单个字段。 这种方法允许您以对象的形式指定收藏路径,文档ID,以及要更新的字段. 它只更新对象中提供的字段,同时将文档中的现有数据保持完整.
<script setup>
const docId = "exampleDocumentId";
const updateItem = { title: "Updated Cool Thing" };
edgeFirebase.changeDoc("myItems", docId, updateItem);
</script>
在这个例子中 changeDoc 方法将使用新值更新指定文档的标题字段,同时保留其他字段。 当您需要修改文档中的单个字段或子集字段而不影响其他数据时,这样做特别有用.
获取单个文档
如果您想要从收藏中查询单个文档,请使用: 边缘 Firebase.getDocData( 收集路径, docId)
<script setup>
const docId = "DrJRpDXVsEEqZu0UB8NT";
const singleDoc = edgeFirebase.getDocData("myItems", docId);
</script>
删除文档 .
删除文档使用: 边缘 Firebase.remove Doc( CollectionPath, docId) 页面存档备份,存于互联网档案馆
<script setup>
const docId = "DrJRpDXVsEEqZu0UB8NT";
const singleDoc = edgeFirebase.removeDoc("myItems", docId);
</script>
快照监听器
在收藏上启动快照收听器
要启动一个快照, 请聆听收藏的用法 : 边缘 Firebase. start Snapshot( 收藏版)
<script setup>
edgeFirebase.startSnapshot("myItems");
</script>
一旦您开始使用该快照的即时反应数据,即可使用 边缘 Firebase. data [collectionPath] (英语)。数据对象中的每个文档都用FireStore的文档编号.
<template>
<div>
<div v-for="item in edgeFirebase.data.myItems" :key="item">
{{ item.title }}
</div>
</div>
</template>
在文档上启动快照收听器
要对收藏中的特定文档启动快照收听器,请使用 edgeFirebase.startDocumentSnapshot(collectionPath, docId) 方法.
<script setup>
edgeFirebase.startDocumentSnapshot("myItems", "exampleDocId");
</script>
一旦您在文档上开始一个快照收听器,该快照的反应数据将随 edgeFirebase.data[collectionPath + '/' + docId]。如果用户已经读取了指定文档的许可,该方法首先检查。 如果用户有权限,它会启动快照收听器,并相应更新反应数据对象. 如果用户没有权限,它会返回一个错误消息,表明缺少读取权限.
也可以询问、排序和限制快照听众.
查询和排序是一系列对象,限制是数字
(如果在不同的密钥上通过不止一个查询, FireStore 可能会使您创建索引)
interface FirestoreQuery {
field: string;
operator: WhereFilterOp; // '==' | '<' | '<=' | '>' | '>=' | 'array-contains' | 'in' | 'array-contains-any';
value: unknown;
}
interface FirestoreOrderBy {
field: string;
direction: "asc" | "desc";
}
有查询、排序和限制的示例:
<script setup>
const query = [{field: "title", operator: "==", value="Cool Thing"}];
const sort = [{ field: "title", direction: "asc" }];
const limit = 10;
edgeFirebase.startSnapshot("myItems", query, sort, limit);
</setup>
停止快照监听器
要停止收听收藏用途: 边緣 Firebase.stopSnapshot( 收集 Path) Name
<script setup>
edgeFirebase.stopSnapshot("myItems");
</setup>
在收藏中停止特定文档的快照收听器时,使用组合 collectionPath + '/' + docId 作为参数 edgeFirebase.stopSnapshot() 方法.
例如:
<script setup>
const documentPath = "myItems/exampleDocId";
edgeFirebase.stopSnapshot(documentPath);
</script>
Firestore 静态采集数据
要从收藏中获取静态数据,请使用对象: 边缘 Firebase. SearchStaticData () ()静态搜索是从一个班级完成的,以更好地处理 Pagination .
const staticSearch = new edgeFirebase.SearchStaticData();
staticSearch.getData("myItems");
在像上面那样初始化之后... 数据将来自 静态搜索.结果.数据
静态数据对象也可以被询问,排序,限制并被相接.
(如果在不同的密钥上通过不止一个查询, FireStore 可能会使您创建索引)
interface FirestoreQuery {
field: string;
operator: WhereFilterOp; // '==' | '<' | '<=' | '>' | '>=' | 'array-contains' | 'in' | 'array-contains-any';
value: unknown;
}
interface FirestoreOrderBy {
field: string;
direction: "asc" | "desc";
}
倾斜
为了标记目的,有两个功能 静态Search.next () 财务报告和审定财务报表 静态Search.prev ()
用于更新 静态搜索.结果.数据 (原始内容存档于2018-10-21). pagination data set. 还有两个帮助变量 静态搜索. 结果. statistic Is FirstPage (如果数据位于第一个页码数据集,则设置为正数)和 静态Search.results.staticIsLastPage (原始内容存档于2018-09-21) (如果数据位于上一个页形数据集,则设置为正数). 注意:由于Firestore pagination的工作方式,你不知道自己在最后一个数据集,直到你尝试查询下一个数据集. 如果您正在使用 静态Search.results.staticIsLastPage (原始内容存档于2018-09-21) 以禁用“ Next” 按钮为例, 它在“ 秒” 点击之前不会发生, 在此情况下 静态搜索.结果.数据 将停留在最后一页的数据集, 它不会破裂.
示例 - 有查询、排序、限制和页码的模板和代码:
<template>
<div>
<div v-for="item in staticSearch.results.data" :key="item">
{{ item.title }}
</div>
<div>
<button
v-if="!staticSearch.results.staticIsFirstPage"
@click="staticSearch.prev()"
>
Previous
</button>
<button
v-if="!staticSearch.results.staticIsLastPage"
@click="staticSearch.next()"
>
Next
</button>
</div>
</div>
</template>
<script setup>
const staticSearch = new edgeFirebase.SearchStaticData();
const query = [{field: "title", operator: "==", value="Cool Thing"}];
const sort = [{ field: "title", direction: "asc" }];
const limit = 10;
staticSearch.getData("myItems", query, sort, limit);
</script>
运行云函数
firebase.run 函数 ('cloudFunction', {data}) ;
此函数允许您通过提供它的名称和可选的数据对象来引用指定的云函数. 用户的UID在调用云函数前自动添加到数据对象中.
参数
functionName:代表要引用的云函数名的字符串.data:一个包含键值对的可选对象,将传递到云函数作为参数. 用户的UID自动包含在数据对象中.
回返
承诺解决所引用的云函数的结果。 被拒绝 可调用请求作为客户端错误报告到边缘监视器,然后 重推不变.
示例
如果你有一个云函数命名 sendNotification 这需要两个论点: message 财务报告和审定财务报表 recipientId。 。 。 .
- 首先,你需要定义
sendNotification函数在 Firebase 中index.js数字 :
const functions = require('firebase-functions');
exports.sendNotification = functions.https.onCall(async (data, context) => {
if (data.uid !== context.auth.uid) {
throw new functions.https.HttpsError('permission-denied', 'Unauthorized access');
}
const message = data.message;
const recipientId = data.recipientId;
const uid = data.uid; // The user's UID is automatically included in the data object
// Your notification sending logic here
return { success: true, message: 'Notification sent successfully' };
});
- 使用
runFunction方法,您将做以下操作:
<script setup>
const edgeFirebase = ...; // Reference to the object containing the runFunction method
const sendNotification = async () => {
try {
const message = "Hello, User!";
const recipientId = "someUserId";
const result = await edgeFirebase.runFunction("sendNotification", { message, recipientId });
console.log("Notification sent successfully:", result);
} catch (error) {
console.error("Error sending notification:", error);
}
};
</script>
<template>
<button @click="sendNotification">Send Notification</button>
</template>
在此示例中,单击“发送通知”按钮将引用 sendNotification 带有指定的云函数 message 财务报告和审定财务报表 recipientId。函数的结果将登录到控制台。 云函数检查是否提供了 data.uid 匹配认证用户的 UID ()context.auth.uid为安全目的.
回应
大多数函数会返回一个可以使用的响应.
const response = edgeFirebase.startSnapshot("things");
const response = await edgeFirebase.storeDoc("myItems", {name: "John Doe"});
重现 :
interface actionResponse {
success: boolean;
message: string;
meta: {}
}
消防车规则
Firestore规则会自动写入您在消防场的项目. 规则文件包含在“//#EDGE FIREBASE Rules Start”和“//#EDGE FIREBASE Rules END”中
rules_version = '2';
// #EDGE FIREBASE RULES START
// #EDGE FIREBASE RULES END