# @edgedev/firebase 中文文档

规范地址：https://npmcn.com/package/%40edgedev/firebase/

版本：26\.10\.2
npm 元数据更新时间：2026-10-05T20:16:30.719Z
中文译文更新时间：2026-11-13T06:42:21.986Z
软件包许可：ISC

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40edgedev/firebase
原文对照：https://npmcn.com/package/%40edgedev/firebase/?lang=original
项目主页：https://github.com/Edge-Marketing-and-Design/edgeDevFirebase#readme
源码仓库：https://github.com/Edge-Marketing-and-Design/edgeDevFirebase

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：944 kB，30 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- 运行依赖：0 个
- peer 依赖：vue ^3\.0\.0，firebase ^9\.12\.1
- 首次发布：2022-10-17T16:16:40.572Z
- 最新版本发布：2026-10-05T20:16:30.542Z
- 近 30 天下载量：45723（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：214（近 12 个月 34 个）

## 中文简介

Vue 3 / Nuxt 3插件或 Nuxt 3 插件用于火地验证和火地.

## 安装

```sh
npm install @edgedev/firebase
```

也可以使用：`pnpm add @edgedev/firebase`、`yarn add @edgedev/firebase`、`bun add @edgedev/firebase`

## README

# @ dedgedev/ firebase (英语)

Vue 3 / Nuxt 3 插件或 Nuxt 3 的全局堆肥,用于 Firebase 认证和 Firestore .

### 目录

**[安装](https://npmcn.com/package/%40edgedev/firebase/#readme-installation)**  
**[用户管理和收藏权限](https://npmcn.com/package/%40edgedev/firebase/#readme-user-management-and-collection-permissions)**  
**[Firebase 验证](https://npmcn.com/package/%40edgedev/firebase/#readme-firebase-authentication)**  
**[Firestore 基本文档交互](https://npmcn.com/package/%40edgedev/firebase/#readme-firestore-basic-document-interactions)**  
**[快照监听器](https://npmcn.com/package/%40edgedev/firebase/#readme-firestore-snapshot-listeners)**  
**[Firestore 静态采集数据](https://npmcn.com/package/%40edgedev/firebase/#readme-firestore-static-collection-data)**  
**[运行云函数](https://npmcn.com/package/%40edgedev/firebase/#readme-run-a-cloud-function)**  
**[边缘监视器出错报告](https://npmcn.com/package/%40edgedev/firebase/#readme-edge-monitor-error-reporting)** **[等待和回应](https://npmcn.com/package/%40edgedev/firebase/#readme-responses)**  
**[消防车规则](https://npmcn.com/package/%40edgedev/firebase/#readme-firestore-rules)**

在潜入文档之前,重要的是要注意,当使用这个包时,你应该总是使用 `await` 或等待承诺解决。 这确保规则助手的工作正确,并为核实用户访问权提供必要的信息。 不等待承诺可能导致访问控制中的不一致以及您的应用程序中的出乎意料的行为. 有关该类如何处理用户权限的更多信息,请参见下一节: **规则助手:管理 Firestore 中的用户权限**。 。 。 .

# 安装

使用 pnpm 安装 :

```bash
pnpm install @edgedev/firebase
```

### KV 所有权和推出

共享边缘供应消费者 `functions/kv/` 执行。 这个包 2026年5月停止复制这些文件,不再将已经过时的文件捆绑 `src/kv/` 副本。 安装此软件包不会创建、更新或删除 消费者的 KV 文件; 通过 Edge 更新工作流程提供这些文件 装入或部署函数,包括在新安装上.

两个Firebase索引模板不再需要或导出 `kvMirrorRetryWorker`。 。 。 . 升级时,邮站取代了Firebase管理的标记块,去除其 保留单独的 `EXTRA EDGE functions` 块. Edge现在拥有执行和职能登记.

更新每个消费者的边缘 **在安装此已清理的软件包之前**编辑 边际迁移必须把不变的平面出口置于管理区块内 消费者的 `functions/index.js`数字 :

```javascript
// 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 读取实际处理器,运行:

```sh
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**。 。 。 . 见 [登录审计设置和查询](https://npmcn.com/package/%40edgedev/firebase/docs/login-audit.md) 用于所需职能, 规则、索引和TTL的推出、根-admin访问和提交限制.

### 安装 Nuxt 3 个全局堆肥

在您的“ 组合” 文件夹中添加一个文件( 例如, 无论什么. ts)

```typescript
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 插件插件插件插件 ):

```javascript
export default defineNuxtConfig({ ssr: false });
```

### 作为插件安装

#### Vue 3 插件, 主例. js :

```javascript
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 .**_

```javascript
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 文件 :**_

```javascript
export default defineNuxtConfig({ ssr: false });
```

#### 在作为插件安装后, 将此包含在您想要使用 EdgeFirebase 的任何组件中的“ 字符设置 ” 中 :

```javascript
<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 没有查询字符串或 大麻碎片.

也可以向当地的边际监测工作者报告:

```typescript
const edgeFirebase = new EdgeFirebase({
  ...config,
  errorReporting: {
    enabled: true,
    monitorUrl: "http://localhost:8787",
    captureConsoleWarnings: false,
  },
}, true)
```

对于创建于 套件安装输出的触发工厂 `functions/config.js`, (中文(简体) ), 包括可调用、HTTP、Firestore、Pub/Sub、调度器和存储触发器. 原错误总是重推, 所以 Firebase 重试和失败语义 不变.

将边缘监视器返回的特定项目的密钥添加到已部署的 函数环境:

```dotenv
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函数"所包裹.

```javascript
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写入您的注册程序.

如何添加用户 :

```javascript
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: '',
          },
        }
});
```

```typescript
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
    }
  };
}
```

### 注册用户

在某人被添加为用户后,他们需要"自我注册"开始使用该系统. 只有已经由拥有指定权限的人添加的用户才能注册. 该功能还检查以确保它们还没有注册.

```javascript
  edgeFirebase.registerUser({
    email: "user@edgemarketingdesign.com",
    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.
  });
```

```typescript
interface userRegister {
  email?: string;
  password?: string;
  meta: object;
  registrationCode: string;
  dynamicDocumentFieldValue?: string;
}
```

#### 使用微软提供商注册.

调用此选项将生成一个 Microsoft Sign In Popup 并使用 Microsoft 证书注册用户 .

```javascript
 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)` 方法.

```javascript
const userRegisterData = {
  registrationCode: "12345",
  dynamicDocumentFieldValue: "fieldName",
};

const response = await edgeFirebase.currentUserRegister(userRegisterData);
```

#### 参数

-   `userRegister` (对象):包含用户注册数据的对象. 它必须包括 `registrationCode` 由邀请组织或成员提供的财产。 还可包括: `dynamicDocumentFieldValue` 属性,表示用于注册的附加数据字段名称.

```typescript
interface userRegister {
  registrationCode: string;
  dynamicDocumentFieldValue?: string;
}
```

#### 回返

方法返回一个承诺 解决到一个 `actionResponse` 对象 :

```typescript
interface actionResponse {
  success: boolean;
  message: string;
  meta: {};
}
```

示例用法:

```javascript
<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>
```

### 许可的解释

-   **指定:布尔** - 当用户拥有收藏的许可时,他们可以指派其他用户参加收藏,并更改收藏的许可。 要让用户能够运行设置用户、存储库、存储用户记录、删除用户记录、存储用户特殊记录或删除用户特殊记录,他们必须能够指定访问这些功能中传入的任何收集路径.
-   **写:布尔** - 允许用户将文档写入收藏
-   **读取:布尔** - 允许用户在收藏中阅读文档
-   **删除:布尔** - 允许用户删除收藏中的文档

### 按角色分列的收藏权限

角色定义用户的权限 。 系统将使用收集-数据/-默认-来查询指定角色的权限. 默认权限可以被更改,也可以根据特定的收藏路径定义角色权限. 如果在查找用户角色权限时找不到特定的收藏路径

-   **管理员 :** 指定:正,写:正,读:正,删:正
-   **编辑器**:指定:虚假,写出:真实,读出:真实,删除:真实
-   **编剧**:指定:虚假,写出:真实,读出:真实,删除:虚假
-   **用户 :** 指定:假,写:假,写:真,删:假

如何更改特定收藏的角色权限 :

```javascript
edgeFirebase.storeCollectionPermissions(
    "myItems/subitems/things",  // Collection path
    "user", // must be admin, editor, writer, user
    {
      assign: false,
      write: false,
      read: true,
      delete: false
    }
 );
```

删除收藏权限 。 这样做是为了在收藏路径被删除时"清理".

```javascript
  edgeFirebase.removeCollectionPermissions(
    "myItems/subitems/things")
```

### 收藏的用户角色

用户根据收集路径分配角色. 由有子集的收藏路径指定的角色,也会决定用户在所有子集上能做什么,或者用户只能被指定一个子集的作用. 例如,如果一个用户被指派作为“我的项目/分项目/事物”的管理员,他们只能访问该收藏。 但如果用户被指派为“我的项目”的管理员,他们将拥有“我的项目”和“我的项目”所有子集的管理员权限.

如何为收藏指定一个用户的角色 :

```javascript
  edgeFirebase.storeUserRoles(
    docId,  //Document ID of user in staged-users collection.
    "myItems/subitems/things",
    "admin"
  );
```

删除收藏用户的角色 :

```javascript
  edgeFirebase.removeUserRoles(
     docId,  //Document ID of user in staged-users collection.
    "myItems/subitems/things"
  );
```

### 根权限和第一个用户

您可以通过在"-"上给用户一个角色来指定用户访问整个工程中的所有收藏,这个角色用于定义根收藏路径. 这将是一个像超级管理员的人。 如果这是您的第一个用户, 您需要手动在“ 阶段用户” 内的 Firstore 控制台设置 。 一旦一个根用户被手动添加,您需要"注册"该用户使用"已升级用户"的docId作为注册代码,请参见此文档的用户注册部分. 您可以使用该用户添加其他"root user",或者设置其他的集合并指派角色给他们. 您还需要手动创建收藏数据/-default-角色权限文档(见上文)和根权限文档,请参见以下示例:

![root-collection-roles](https://npmcn.com/package/%40edgedev/firebase/images/default-collection-roles.png)

![root-collection-roles](https://npmcn.com/package/%40edgedev/firebase/images/root-collection-roles.png)

![root-user](https://npmcn.com/package/%40edgedev/firebase/images/root-user.png)

### 用户特殊权限

如果您想要给一个用户一个无法匹配该收藏的管理员或用户角色的收藏独有的一组权限,可以设置"特别权限".

```javascript
  edgeFirebase.storeUserSpecialPermissions(
     docId,  //Document ID of user in staged-users collection.
    "myItems/subitems/things",
    {
      assign: false,
      write: true,
      read: true,
      delete: true
    }
  );
```

删除用户特殊权限 :

```javascript
  edgeFirebase.removeUserSpecialPermissions(
     docId,  //Document ID of user in staged-users collection.
    "myItems/subitems/things"
  );
```

### 规则助手:管理 Firestore 中的用户权限

该软件包提供了一个工具,旨在协助管理用户对您 Firestore 项目中各种动作的权限。 通过服用 `collectionPath` 还有一个 `action` 作为输入参数,它确定用户的作用和特殊权限,并保存一个 `RuleCheck` 对象 `rule-helpers` 藏书.

这个 `RuleCheck` 对象包含权限类型,权限检查路径,完整路径,以及动作,提供必要的信息来验证用户的访问权限. 通过通过用户的角色和特殊权限来活化,该类识别正确的权限检查路径和类型.

该类在维护数据安全和您Firestore项目中的访问控制方面发挥着至关重要的作用. 它确保用户只能根据其角色和特殊权限执行他们被授权的行动.

### 删除用户

删除用户功能实际上不会将用户完全从系统中删除,而是去除运行该功能的用户已经指定访问权限的所有角色和特殊权限. 这样,就"指定用户"而言,用户会被"删除",但用户仍将是"指定用户"无法访问的集合的用户.

```javascript
edgeFirebase.removeUser(docId);
```

### 删除自己

此功能允许用户删除自己的账户. 它会从两个版本中删除用户的文档 `users` 财务报告和审定财务报表 `staged-users` 数据库中的收藏,并删除用户的认证记录. 函数返回一个 `actionResponse` 显示操作成败的对象.

#### 使用量

要删除当前用户的账户,请拨打 `deleteSelf` 函数 :

```javascript
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列出的索引.

```javascript
edgeFirebase.startUsersSnapshot("myItems");
// Stop users snapshot:
edgeFirebase.stopUsersSnapshot();
```

```vue
<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>
```

```typescript
interface user {
  docId: string;
  roles: role[];
  specialPermissions: specialPermission[];
  userId: string;
  uid: string;
}
```

```typescript
interface role {
  collectionPath: "-" | string; // - is root
  role: "admin" | "editor" | "writer" | "user";
}
```

```typescript
interface specialPermission {
  collectionPath: "-" | string; // - is root
  permissions: permissions;
}
```

```typescript
interface permissions {
  assign: boolean;
  read: boolean;
  write: boolean;
  delete: boolean;
}
```

# Firebase 验证

### 电子邮件和密码登录 :

```javascript
  edgeFirebase.logIn(
    {
      email: "devs@edgemarketing.com",
      password: "pasword"
    }
  );
```

### 与微软登录

此功能允许用户登录使用他们的微软账户. 如果您想要向用户请求额外权限,也可以指定一个提供者范围。 该函数返回一个承诺, 承诺将在签名进程完成后解决 。 如果用户不存在,则会触发出错并登录用户出局.

#### 使用量

要登录微软账户,请联系 `logInWithMicrosoft` 函数。 也可以通过一系列提供者范围作为可选参数.

```javascript
// 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中

用户对象具有反应性并包含这些项:

```typescript
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 听器 .

以下是使用登录的样本组件 :

```html
<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>
```

```javascript
<script setup>
const email = ref("");
const password = ref("");
const login = () => {
  edgeFirebase.logIn(
    {
      email: email.value,
      password: password.value
    },
    true
  );
};
</script>
```

### 更新用户电子邮件

要更新当前认证用户的电子邮件地址,请使用 `edgeFirebase.updateEmail(newEmail)` 方法.

```javascript
const response = await edgeFirebase.updateEmail("new.email@example.com");
```

#### 参数

-   `newEmail` (字符串):为用户设置的新电子邮件地址.

#### 回返

方法返回一个承诺 解决到一个 `actionResponse` 对象 :

```typescript
interface actionResponse {
  success: boolean;
  message: string;
  meta: {};
}
```

示例用法:

```javascript
<script setup>
  async function changeEmail() {
    const newEmail = "new.email@example.com";
    const response = await edgeFirebase.updateEmail(newEmail);
    if (response.success) {
      console.log("Email updated successfully");
    } else {
      console.error("Error updating email:", response.message);
    }
  }
</script>
```

### 更改密码 :

此功能允许用户在登录时更改当前密码 :

```javascript
edgeFirebase.setPassword("old-password", "new-password");
```

### 密码重置 :

对于未登录的用户( 如被遗忘的密码) 。 如果项目设置将密码重置为自定义密码重置页面,则此进程为两步进程.

步骤1:

```javascript
edgeFirebase.sendPasswordReset('user@edgemarketingdesign.com');
```

步骤2: (如果密码重定向被设置到自定义页面,则需要从查询字符串中取出"oobCode"并连同新的密码一起通过. )

```javascript
edgeFirebase.passwordReset('NewPassword123','AAaaAABaaaaAAABBBaaaBBBBAaaaaBABAbbaa');
```

### 更新用户元 :

用户登录时可以更新自己的元数据. 包含元数据的对象只会更新/添加对象所传递的密钥.

```javascript
edgeFirebase.setUserMeta({ lastName: "Smith" });
```

# Firestore 基本文档交互

### 添加/更新文档

添加和更新文档都使用相同的函数: **边缘 Firebase.storeDoc(CollectionPath,对象)**。要更新文档,对象必须包含密钥 **医生**,且值必须与正在更新的收藏中文档的ID相匹配 _(注:所有通过边缘Firebase函数返回的文档,都会在文档对象中插入 docId)_如果对象不包含 docId 或 DocId 在收藏中不匹配文档,则将创建一个新文档.

```javascript
<script setup>
const addItem = {title: "Cool Thing"};
edgeFirebase.storeDoc("myItems", addItem);
</script>
```

注意: 当文档被写入收藏时, 添加了几个其他可以引用的密钥 : **doc 已创建 at** (博士创建的时间戳), **上次更新( n)** (上次写的时间戳文档), **用户** (更新或创建文档的用户的用户id).

### 更新文档字段

相对于 `storeDoc` 方法,用于添加或更新整个文档,可以使用 `edgeFirebase.changeDoc(collectionPath, docId, object)` 在文档中更新单个字段。 这种方法允许您以对象的形式指定收藏路径,文档ID,以及要更新的字段. 它只更新对象中提供的字段,同时将文档中的现有数据保持完整.

```javascript
<script setup>
const docId = "exampleDocumentId";
const updateItem = { title: "Updated Cool Thing" };
edgeFirebase.changeDoc("myItems", docId, updateItem);
</script>
```

在这个例子中 `changeDoc` 方法将使用新值更新指定文档的标题字段,同时保留其他字段。 当您需要修改文档中的单个字段或子集字段而不影响其他数据时,这样做特别有用.

### 获取单个文档

如果您想要从收藏中查询单个文档,请使用: **边缘 Firebase.getDocData( 收集路径, docId)**

```javascript
<script setup>
const docId = "DrJRpDXVsEEqZu0UB8NT";
const singleDoc = edgeFirebase.getDocData("myItems", docId);
</script>
```

### 删除文档 .

删除文档使用: **边缘 Firebase.remove Doc( CollectionPath, docId) 页面存档备份,存于互联网档案馆**

```javascript
<script setup>
const docId = "DrJRpDXVsEEqZu0UB8NT";
const singleDoc = edgeFirebase.removeDoc("myItems", docId);
</script>
```

# 快照监听器

### 在收藏上启动快照收听器

要启动一个快照, 请聆听收藏的用法 : **边缘 Firebase. start Snapshot( 收藏版)**

```javascript
<script setup>
edgeFirebase.startSnapshot("myItems");
</script>
```

一旦您开始使用该快照的即时反应数据,即可使用 **边缘 Firebase. data \[collectionPath\] (英语)**。数据对象中的每个文档都用FireStore的文档编号.

```html
<template>
  <div>
    <div v-for="item in edgeFirebase.data.myItems" :key="item">
      {{ item.title }}
    </div>
  </div>
</template>
```

### 在文档上启动快照收听器

要对收藏中的特定文档启动快照收听器,请使用 `edgeFirebase.startDocumentSnapshot(collectionPath, docId)` 方法.

```javascript
<script setup>
  edgeFirebase.startDocumentSnapshot("myItems", "exampleDocId");
</script>
```

一旦您在文档上开始一个快照收听器,该快照的反应数据将随 `edgeFirebase.data[collectionPath + '/' + docId]`。如果用户已经读取了指定文档的许可,该方法首先检查。 如果用户有权限,它会启动快照收听器,并相应更新反应数据对象. 如果用户没有权限,它会返回一个错误消息,表明缺少读取权限.

### 也可以询问、排序和限制快照听众.

#### 查询和排序是一系列对象,限制是数字

(如果在不同的密钥上通过不止一个查询, FireStore 可能会使您创建索引)

```typescript
interface FirestoreQuery {
  field: string;
  operator: WhereFilterOp; // '==' | '<' | '<=' | '>' | '>=' | 'array-contains' | 'in' | 'array-contains-any';
  value: unknown;
}

interface FirestoreOrderBy {
  field: string;
  direction: "asc" | "desc";
}
```

##### 有查询、排序和限制的示例:

```javascript
<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**

```javascript
<script setup>
edgeFirebase.stopSnapshot("myItems");
</setup>
```

在收藏中停止特定文档的快照收听器时,使用组合 `collectionPath + '/' + docId` 作为参数 `edgeFirebase.stopSnapshot()` 方法.

例如:

```javascript
<script setup>
const documentPath = "myItems/exampleDocId";
edgeFirebase.stopSnapshot(documentPath);
</script>
```

# Firestore 静态采集数据

要从收藏中获取静态数据,请使用对象: **边缘 Firebase. SearchStaticData () ()**静态搜索是从一个班级完成的,以更好地处理 Pagination .

```javascript
const staticSearch = new edgeFirebase.SearchStaticData();
staticSearch.getData("myItems");
```

在像上面那样初始化之后... 数据将来自 **静态搜索.结果.数据**

### 静态数据对象也可以被询问,排序,限制并被相接.

(如果在不同的密钥上通过不止一个查询, FireStore 可能会使您创建索引)

```typescript
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” 按钮为例, 它在“ 秒” 点击之前不会发生, 在此情况下 **静态搜索.结果.数据** 将停留在最后一页的数据集, 它不会破裂.

### 示例 - 有查询、排序、限制和页码的模板和代码:

```html
<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>
```

```javascript
<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`。 。 。 .

1.  首先,你需要定义 `sendNotification` 函数在 Firebase 中 `index.js`数字 :

```javascript
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' };
});
```

1.  使用 `runFunction` 方法,您将做以下操作:

```javascript
<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`为安全目的.

# 回应

大多数函数会返回一个可以使用的响应.

```javascript
const response = edgeFirebase.startSnapshot("things");
const response = await edgeFirebase.storeDoc("myItems", {name: "John Doe"});
```

重现 :

```typescript
interface actionResponse {
  success: boolean;
  message: string;
  meta: {}
}
```

# 消防车规则

Firestore规则会自动写入您在消防场的项目. 规则文件包含在“//#EDGE FIREBASE Rules Start”和“//#EDGE FIREBASE Rules END”中

```javascript
rules_version = '2';
// #EDGE FIREBASE RULES START

// #EDGE FIREBASE RULES END
```

## 许可证

[公务员制度委员会](https://choosealicense.com/licenses/isc/)

## 常见问题

### @edgedev/firebase 是什么？

Vue 3 / Nuxt 3插件或 Nuxt 3 插件用于火地验证和火地\.

### 如何安装 @edgedev/firebase？

在项目目录运行 npm install @edgedev/firebase，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：vue（^3\.0\.0）、firebase（^9\.12\.1）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @edgedev/firebase 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/edgedev\_\_firebase 是否存在。

### @edgedev/firebase 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @edgedev/firebase 可以商用吗？

@edgedev/firebase 使用 ISC 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @edgedev/firebase 的下载量有多少？

根据 npm 官方下载统计，@edgedev/firebase 在 2026/10/13 – 2026/11/11 这 30 天内被下载 45,723 次，日均约 1,524 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @edgedev/firebase 还在维护吗？

最新版本 26\.10\.2 发布于 2026/10/06（1 个月前）；至今共发布 214 个版本，其中过去 12 个月发布了 34 个；首次发布于 2022/10/18。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

