You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript版Firebase Functions Gen2中添加Firestore文档

在Firebase Gen2 TypeScript函数中向Firestore添加文档

问题描述

我想在Firebase函数中向Firestore集合添加文档,但找到的大多是Gen1的非模块化实现示例,代码如下:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
  
// 在函数内部:
return admin.firestore().doc('users/'+user.uid).set(userObject);

但这类用require引入firebase-admin的写法属于Gen1方案,会被TypeScript ESLint提示错误:

Require statement not part of import statement @typescript-eslint/no-var-requires

我当前使用的是Gen2的TypeScript代码框架,请问如何在其中实现添加文档的功能?我的现有代码如下:

import { setGlobalOptions } from "firebase-functions/v2";
import { onDocumentCreated } from "firebase-functions/v2/firestore";


setGlobalOptions({ region: "europe-west6" });

exports.sendEmail = onDocumentCreated("invites/{email}", (event: any) => {
  const snapshot = event.data;
  if (!snapshot) {
    console.log("No data associated with the event");
    return;
  }
  const data = snapshot.data();
  const email = {
      to: data.email,
      message: {
        subject: "You have been invited to join " + data.householdName,
        html:
          "Hello " +
          data.email +
          ",<br><br>You have been invited to join " +
          data.householdName +
          " by " +
          data.inviter +
          '.<br><br>Click <a href="https://plan-eat-ced91.web.app/">here</a> to join!',
      },
    }
  // 这里该怎么用Firebase实现等价功能?
  admin
    .firestore()
    .collection("mail")
    .add(email );

});

解决方案

1. 正确导入并初始化firebase-admin

在Gen2的TypeScript项目中,用ES模块的import语法替代require,同时完成admin SDK的初始化:

import { setGlobalOptions } from "firebase-functions/v2";
import { onDocumentCreated } from "firebase-functions/v2/firestore";
// 导入firebase-admin并初始化
import * as admin from "firebase-admin";
admin.initializeApp();

2. 异步处理Firestore操作

Firestore的add()方法是异步操作,必须返回Promise确保函数执行完成后再终止,避免逻辑中断。修改后的完整函数代码如下:

exports.sendEmail = onDocumentCreated("invites/{email}", async (event: any) => {
  const snapshot = event.data;
  if (!snapshot) {
    console.log("No data associated with the event");
    return;
  }
  const data = snapshot.data();
  const email = {
      to: data.email,
      message: {
        subject: `You have been invited to join ${data.householdName}`,
        html: `Hello ${data.email},<br><br>You have been invited to join ${data.householdName} by ${data.inviter}.<br><br>Click <a href="https://plan-eat-ced91.web.app/">here</a> to join!`,
      },
    };
  
  // 向mail集合添加文档
  await admin.firestore().collection("mail").add(email);
  console.log("Email document added successfully");
});

关键说明

  • 使用import * as admin from "firebase-admin"替代require,完全符合TypeScript ESLint的规范要求。
  • 给函数添加async关键字,并用await处理add()方法返回的Promise,确保函数等待数据库操作完成后再结束。
  • 用模板字符串(${})替代字符串拼接,让代码更简洁易读。

内容的提问来源于stack exchange,提问作者J4N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:32:47