使用 Node.js SDK 通过 Firestore 进行 CRUD

2025-06-07

使用 Node.js SDK 通过 Firestore 进行 CRUD

Cloud Firestore 非常适合构建内部应用,因为它可以帮您处理数据库管理的所有复杂细节。在本教程中,我们将向您展示如何使用 Node.js SDK 通过 Cloud Firestore 设置一个基本的 CRUD 应用:

为 Cloud Firestore 设置 Node.js SDK

首先,您需要安装 Node.js 客户端库并初始化数据库实例。您可以通过npm安装该库:

npm install firebase-admin --save 
Enter fullscreen mode Exit fullscreen mode

安装软件包后,您需要初始化数据库。您可以使用Firebase Cloud Functions、Google Cloud Platform 或您自己的服务器来完成此操作。在本教程中,我们将快速向您展示如何使用服务帐户用于向应用程序发出 API 请求的帐户身份)在您自己的服务器上初始化数据库(在此处了解有关服务帐户的更多信息)。

首先,您需要进入 Google Cloud Platform 帐户中的“服务帐户”菜单(位于“IAM 和管理员”下)。从那里,生成一个新的私钥,将其保存为 JSON 文件,然后将其添加到您的服务器。

然后,在您的index.js文件中引入该firebase-admin库,并从服务器导入您的服务帐号私钥。使用该firebase-admin库初始化您的应用程序,并传递一个对象credential作为键,并firestore.credential.cert()以您的服务帐号作为参数作为值。

const fs = require('firebase-admin');

const serviceAccount = require('./path/to/key.json');

fs.initializeApp({
 credential: fs.credential.cert(serviceAccount)
});
Enter fullscreen mode Exit fullscreen mode

最后,调用firestore()方法来创建数据库。

const db = fs.firestore(); 
Enter fullscreen mode Exit fullscreen mode

使用 Firestore Node.js SDK 进行基本 CRUD

如果没有一些示例数据,这根本算不上一个 CRUD 教程,所以让我们先来了解一下。假设我们正在为一家在线零售商构建内部工具——比如说一个向客服代表展示用户数据的工具:

{
 "first": "Liam",
 "last": "Ragozzine",
 "address": "133 5th St., San Francisco, CA",
 "birthday": "05/13/1990",
 "age": "30"
},
{
 "first": "Vanessa",
 "last": "Peluso",
 "address": "49 Main St., Tampa, FL",
 "birthday": "11/30/1977",
 "age": "47"
}
Enter fullscreen mode Exit fullscreen mode

当然,这个数据集过于简单了 - 对于更复杂的设置,有几种在 Firestore 中构建数据的选项:

  • 文件
  • 多个集合
  • 文档内的子集合

每种方案都有其优缺点,体现在易用性、可扩展性和复杂性方面。您可以点击此处,了解更多关于在 Cloud Firestore 中构建数据的信息。

明白了吗?太棒了!现在开始 CRUD。

使用创建数据set()

要填充数据库,我们将使用set()方法。首先,我们要指定要用userscollection()方法填充集合。为此,只需将集合的名称作为字符串传递给方法即可:

const usersDb = db.collection('users'); 
Enter fullscreen mode Exit fullscreen mode

现在,我们需要指定第一个文档,以便添加新用户 Liam Ragozzine。为此,我们将使用doc()方法。要使用此方法,请将id文档的doc()以字符串形式传入。在本例中,id为“lragozzine”。

const liam = usersDb.doc('lragozzine'); 
Enter fullscreen mode Exit fullscreen mode

指定我们要添加的文档后,我们可以通过将数据作为对象传递进去来设置文档的数据set()

await liam.set({
 first: 'Liam',
 last: 'Ragozzine',
 address: '133 5th St., San Francisco, CA',
 birthday: '05/13/1990',
 age: '30'
});
Enter fullscreen mode Exit fullscreen mode

太棒了!现在,如果我们想添加第二个用户,它看起来会像这样:

await usersDb.doc('vpeluso').set({
 first: 'Vanessa',
 last: 'Peluso',
 address: '49 Main St., Tampa, FL',
 birthday: '11/30/1977',
 age: '47'
});
Enter fullscreen mode Exit fullscreen mode

需要注意的是:set()如果文档已存在,该方法将覆盖该文档。我们之前一直使用.doc(ID)来通过 创建新文档set(),但如果传入的 ID 对应的文档已存在,则传入的数据.set()将覆盖当前存在的数据。

现在我们的数据库中已经有了数据,我们可以继续读取它。

使用以下方式读取数据get()

要从 Firestore 读取数据,请使用get()方法。要从集合中读取,请collection()在调用 之前指定get()。或者,如果您需要从文档中读取,请doc()在调用 之前指定get()

// get collection
const users = await db.collection('users').get();

// get document
const liam = await db.collection('users').doc('liam').get();
Enter fullscreen mode Exit fullscreen mode

如果文档不存在,结果将为空。因此,在上面的例子中,liam将没有数据。您可以通过在文档上调用 exist 来检查这一点。如果文档存在exists,它将返回 true,您可以调用它data()来读取文档的数据。否则,它将返回 false。

if (!liam.exists) {
 console.log('No document');
} else {
 console.log(liam.data());
}
Enter fullscreen mode Exit fullscreen mode

要过滤(“查询”)结果,您可以使用where(),它接受三个参数:

  1. 集合中用于测试值的字段
  2. 关系运算符(例如 <、> 或 ==)
  3. 要评估的第一个参数的值

例如,如果我们想要 40 岁以下用户的所有文档,我们将使用以下命令:

const under30 = await
 db.collection('users').where('age', '<=', 40).get();
Enter fullscreen mode Exit fullscreen mode

onSnapshot()Cloud Firestore 的一大亮点在于,您可以使用方法获取数据的实时更新。这让您可以监听数据库中任何文档的更改。初始化 方法并传递一个回调函数来处理数据后,每次内容发生变化时,您都会收到更新。

const liam = db.collection('users').doc('liam');

const observer = liam.onSnapshot(snapshot => {
 console.log(`changes: ${snapshot}`);
}, err => {
 console.log(`Error: ${err}`);
});
Enter fullscreen mode Exit fullscreen mode

现在,您的应用已跟上最新趋势。😎

set()使用和更新数据update()

在 Firestore 中,有两种更新数据的方法:set()update()。简而言之,使用set()通常会覆盖您正在处理的整个文档,而update()最适合更新特定字段,同时保持其他字段不变。

首先set(),如果我们想在 Liam 的文档中注明他已婚,我们会set()使用对象进行调用{ married: true }。正如我们上面提到的,需要注意的是,如果对已存在的文档使用 set() ,除非您像这样指定,否则它将被覆盖merge: true

const liam = await
 db.collection('users').doc('lragozzine').set({
   married: true
 }, { merge: true });
Enter fullscreen mode Exit fullscreen mode

提示:如果您不确定文档是否已经存在,请添加merge以防万一,这样就不会覆盖您的数据。

要使用此update()方法更新文档中的字段,请将包含要更新的字段的对象作为参数传递给update()

const liam = await
 db.collection('users').doc('lragozzine').update({
   married: true
 });
Enter fullscreen mode Exit fullscreen mode

要更新嵌套对象中的数据,您还需要使用update()。如果我们想添加一个包含客户喜爱事物(例如喜欢的颜色、产品线或 90 年代的烂电视节目)的键值对的对象,我们会传递一个以路径为键的对象,如下所示:

const liam = await
 db.collection('users').doc('lragozzine').update({
   'favorites.item': 'Ties'
 });
Enter fullscreen mode Exit fullscreen mode

现在我们知道如何合并和更新我们的文档,让我们继续删除。

删除数据delete()

这应该不奇怪:你可以使用delete()方法从 Firestore 中删除数据。它看起来像这样:

await db.collection('users').doc('lragozzine').delete(); 
Enter fullscreen mode Exit fullscreen mode

这将从数据库中删除 Liam 的整个文档users

注意:删除文档并不会删除该文档的子集合。因此,如果 Liam 的文档中有一个包含订单数据的文档的子集合,名为orders,那么即使删除了该lragozzine文档,我们仍然可以访问该子集合orders,如下所示:

const liamOrders = await db.collection('users').doc('lragozzine')
 .collection('orders').doc('123').get();
Enter fullscreen mode Exit fullscreen mode

删除字段,请在命令FieldValue.delete()中使用update()。首先,必须导入FieldValue对象,然后调用delete()它,如下所示:

const FieldValue = fs.firestore.FieldValue;

const r = await
 db.collection('users').doc('lragozzine').update({
   married: FieldValue.delete();
 });
Enter fullscreen mode Exit fullscreen mode

删除整个集合会稍微复杂一些,因为您必须发出请求来检索集合中的所有文档,然后逐个删除它们。有关删除集合的更多信息,请参阅Firebase 指南

恭喜!您现在是 Cloud Firestore CRUD 专家了。

文章来源:https://dev.to/retool/crud-with-firestore-using-the-node-js-sdk-anp
PREV
如何构建 React 表单组件
NEXT
Python vs Rust:我都测试过了。胜者是……