如何在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
相关产品推荐
相关产品推荐

