使用 Firebase/Firestore(CRUD)构建 Nodejs 服务器

2025-06-08

使用 Firebase/Firestore(CRUD)构建 Nodejs 服务器

介绍

在本文中,我们将研究如何使用 Firebase 和 Firestore 构建 Node.js 服务器。
我们还将在服务器中构建 CRUD(创建、读取、更新、删除)功能。

本文中需要注意的主题

  • 什么是 node js 和 firebase?
  • 设置我们的项目文件夹
  • 安装必要的依赖项
  • Es6 设置(.babelrc)
  • 配置firebase
  • 设置配置文件
  • 创建 Express 服务器(index.js)
  • 建立我们的模型
  • 构建 crud 功能(控制器)
  • 路线
  • 运行服务器

什么是 node js 和 firebase?

Nodejs是一个开源、跨平台的 JavaScript 运行时环境和库,用于在客户端浏览器之外运行 Web 应用程序。Nodejs 用于构建异步和事件驱动模型的后端服务器。如果您的本地计算机上尚未安装 Node.js,可以在此处下载。

Firebase是由 Google 提供的后端即服务 (BaaS) 应用开发平台,它托管各种后端服务,例如实时数据库、云存储、身份验证、崩溃报告、机器学习、远程配置以及静态文件托管。
我们今天要使用的 Firebase 服务是 Firestore,它是 Firebase 提供的数据库。它是一个面向文档的 No SQL 数据库。

设置我们的项目文件夹

首先,我们需要创建一个文件夹,我这里命名为 node-firebase,不过你也可以随便取一个。这将是我们的根工作目录。

然后在您的终端中运行以下脚本:

Npm init -y

这应该在我们的文件夹的根目录中创建一个 package.json 文件。

接下来,我们需要在项目文件夹的根目录中创建以下文件:

  • index.js - 这是我们服务器的主文件
  • firebase.js - 这是启动数据库连接的地方
  • config.js - 包含所有必要的配置,有助于维护干净的工作环境。我将其称为任何服务器中的“大脑盒”文件。
  • .env - 包含我们所有的环境变量

还要在项目文件夹的根目录中创建以下文件夹:

  • 控制器
  • 模型
  • 路线

安装必要的依赖项

运行以下脚本来安装所需的依赖项:

npm install express cors dotenv firebase

npm install nodemon –save-dev

使用 –save-dev 将我们的nodemon安装为 dev 依赖项

Es6 设置(babel)

这将使我们能够使用 es6 语法编写代码。

在我们的终端中,我们运行以下脚本来安装我们的 babel 包作为开发依赖项:

npm install @babel/core @babel/node @babel/cli @babel/preset-env –save-dev

依赖项成功安装后,在项目文件夹根目录下创建.babelrc文件,并添加以下代码:

{
"presets": [["@babel/preset-env"]]
}

最后,在 package.json 中添加以下行:

"type": "module"

我们可以使用 es6 语法。

设置 Firebase

安装依赖项后,我们进入Firebase 控制台并按照以下步骤操作:

  • 点击添加项目
  • 输入项目名称
  • 我们可以关闭该项目的分析。
  • 点击创建项目
  • 点击代码按钮
  • 输入应用程序的名称,然后单击注册应用程序按钮
  • 点击 cloud firestore(创建数据库)
  • 点击设置并复制firebase配置

设置配置文件

  • .env 文件

成功执行上述步骤后,在项目文件夹的根目录中创建一个 .env 文件并添加以下代码。

PORT=5000
HOST=localhost
HOST_URL=http://localhost:5000




#firebase config
API_KEY=””
AUTH_DOMAIN=””
PROJECT_ID=””
STORAGE_BUCKET=””
MESSAGING_SENDER_ID=””
APP_ID=””
Enter fullscreen mode Exit fullscreen mode

使用在 Firebase 控制台上生成的 Firebase 配置详细信息替换字符串。

配置.js

完成上述操作后,您可以将以下代码复制到文件夹根目录中的 config.js 文件中。

import dotenv from 'dotenv';
import assert from 'assert';

dotenv.config();

const {
  PORT,
  HOST,
  HOST_URL,
  API_KEY,
  AUTH_DOMAIN,
  PROJECT_ID,
  STORAGE_BUCKET,
  MESSAGING_SENDER_ID,
  APP_ID,
} = process.env;

assert(PORT, 'Port is required');
assert(HOST, 'Host is required');

export default {
  port: PORT,
  host: HOST,
  hostUrl: HOST_URL,
  firebaseConfig: {
    apiKey: API_KEY,
    authDomain: AUTH_DOMAIN,
    projectId: PROJECT_ID,
    storageBucket: STORAGE_BUCKET,
    messagingSenderId: MESSAGING_SENDER_ID,
    appId: APP_ID,
  },
};

Enter fullscreen mode Exit fullscreen mode

Firebase.js

在 firebase.js 文件中添加以下代码来初始化我们的数据库:

import { initializeApp } from 'firebase/app';
import config from './config.js';

const firebase = initializeApp(config.firebaseConfig);

export default firebase;
Enter fullscreen mode Exit fullscreen mode

创建 Express 服务器(index.js)

在index.js文件中,添加以下代码:

import express from 'express';
import cors from 'cors';

import config from './config.js';

const app = express();

app.use(cors());
app.use(express.json());


app.listen(config.port, () =>
  console.log(`Server is live @ ${config.hostUrl}`),
);

Enter fullscreen mode Exit fullscreen mode

如果我们运行,npm start我们的服务器应该启动并运行。

建立我们的模型

在您的模型文件夹中创建一个名为 productModel.js 的文件并添加以下代码:

class Product {
  constructor(id, name, price, retailer, amountInStock) {
    (this.id = id),
      (this.name = name),
      (this.price = price),
      (this.retailer = retailer),
      (this.amountInStock = amountInStock);
  }
}

export default Product;
Enter fullscreen mode Exit fullscreen mode

构建 crud 功能(控制器)

Crud 代表创建、读取、更新和删除。这些是构建 API 的基础。

在controllers文件夹中,创建一个名为productControllers.js的文件,并分别添加以下代码块:

在顶部:

import firebase from '../firebase.js';
import Product from '../models/productModel.js';
import {
  getFirestore,
  collection,
  doc,
  addDoc,
  getDoc,
  getDocs,
  updateDoc,
  deleteDoc,
} from 'firebase/firestore';

const db = getFirestore(firebase);
Enter fullscreen mode Exit fullscreen mode

创建产品功能:

export const createProduct = async (req, res, next) => {
  try {
    const data = req.body;
    await addDoc(collection(db, 'products'), data);
    res.status(200).send('product created successfully');
  } catch (error) {
    res.status(400).send(error.message);
  }
};
Enter fullscreen mode Exit fullscreen mode

获取所有产品功能:

export const getProducts = async (req, res, next) => {
  try {
    const products = await getDocs(collection(db, 'products'));
    const productArray = [];

    if (products.empty) {
      res.status(400).send('No Products found');
    } else {
      products.forEach((doc) => {
        const product = new Product(
          doc.id,
          doc.data().name,
          doc.data().price,
          doc.data().retailer,
          doc.data().amountInStock,
        );
        productArray.push(product);
      });

      res.status(200).send(productArray);
    }
  } catch (error) {
    res.status(400).send(error.message);
  }
};
Enter fullscreen mode Exit fullscreen mode

通过 ID 获取产品:

export const getProduct = async (req, res, next) => {
  try {
    const id = req.params.id;
    const product = doc(db, 'products', id);
    const data = await getDoc(product);
    if (data.exists()) {
      res.status(200).send(data.data());
    } else {
      res.status(404).send('product not found');
    }
  } catch (error) {
    res.status(400).send(error.message);
  }
};
Enter fullscreen mode Exit fullscreen mode

通过 ID 更新产品:

export const updateProduct = async (req, res, next) => {
  try {
    const id = req.params.id;
    const data = req.body;
    const product = doc(db, 'products', id);
    await updateDoc(product, data);
    res.status(200).send('product updated successfully');
  } catch (error) {
    res.status(400).send(error.message);
  }
};
Enter fullscreen mode Exit fullscreen mode

最后,删除产品功能:

export const deleteProduct = async (req, res, next) => {
  try {
    const id = req.params.id;
    await deleteDoc(doc(db, 'products', id));
    res.status(200).send('product deleted successfully');
  } catch (error) {
    res.status(400).send(error.message);
  }
};
Enter fullscreen mode Exit fullscreen mode

路线

在我们的 routes 文件夹中,创建一个名为 productRoute.js 的文件,并将以下文件编码到其中:

import express from 'express';

import {
  createProduct,
  getProduct,
  getProducts,
  updateProduct,
  deleteProduct,
} from '../controllers/productController.js';

const router = express.Router();

router.get('/', getProducts);
router.post('/new', createProduct);
router.get('/product/:id', getProduct);
router.put('/update/:id', updateProduct);
router.delete('/delete/:id', deleteProduct);

export default router;

Enter fullscreen mode Exit fullscreen mode

为了访问此路线,我们必须更新 index.js 文件:

导入产品路线文件:

import productRoute from './routes/productRoute.js';

初始化路线:

app.use('/api', productRoute);

我们的最终 index.js 应该是这样的:

import express from 'express';
import cors from 'cors';

import config from './config.js';
import productRoute from './routes/productRoute.js';

const app = express();

app.use(cors());
app.use(express.json());

//routes
app.use('/api', productRoute);

app.listen(config.port, () =>
  console.log(`Server is live @ ${config.hostUrl}`),
);

Enter fullscreen mode Exit fullscreen mode

运行服务器

为了运行我们的 nodejs-firebase 服务器;

我们必须在 package.json 中的脚本中添加启动命令:

"start": "nodemon index.js"

此后,我们可以使用以下命令在终端中运行服务器命令:

npm start

您现在可以使用 postman 来确保您的 api 运行正常,还可以查看 firestore 数据库中创建的文件。

结论

在本文结束时,您应该能够使用 firebase 创建一个可运行的 Nodejs 服务器。

这是github 上的源代码链接。

祝您编码愉快。

鏂囩珷鏉ユ簮锛�https://dev.to/ibukunfolay/build-a-nodejs-server-using-firebasefirestore-crud-2725
PREV
Flutter 初学者指南
NEXT
Next.js 入门指南