使用Firebase/Firestore(CRUD)构建Nodejs服务器
#javascript #网络开发人员 #node #firebase

介绍

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

本文中要注意的主题

  • 什么是节点JS和Firebase?
  • 设置我们的项目文件夹
  • 安装必要依赖项
  • ES6设置(.babelrc)
  • 配置Firebase
  • 设置配置文件
  • 创建Express Server(index.js)
  • 建立我们的模型
  • 建立CRUD功能(控制器)
  • 路线
  • 运行服务器

什么是节点JS和firebase?

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

firebase 是由Google提供的后端-AS-AS-Service(BAAS)应用程序开发平台,该平台托管了后端服务,例如实时数据库,云存储,身份验证,崩溃报告,机器学习,机器学习,机器学习,远程配置,并为您的静态文件托管。
我们今天将从Firebase使用的服务是Firestore,这是Firebase提供的数据库。这是一个面向未经SQL文档的数据库。

设置我们的项目文件夹

首先,我们必须创建一个文件夹,就我而言,我将其称为Node-firebase,但随时可以命名。这将是我们的根目录。

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

Npm init -y

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

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

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

还可以在项目文件夹的根部创建以下文件夹:

  • 控制器
  • 模型
  • 路线

安装必要依赖

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

npm install express cors dotenv firebase

npm install nodemon –save-dev

使用`save-dev安装我们的 nodemon 作为dev依赖关系

ES6设置(babel)

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

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

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

成功安装了依赖项后,在项目文件夹的根部创建一个文件.babelrc,然后添加以下代码:

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

最后,在软件包中。

"type": "module"

我们很高兴使用ES6语法。

设置Firebase

安装了依赖项后,我们转到firebase console a请按照以下步骤操作:

  • 单击添加项目
  • 输入项目的名称
  • 我们可以关闭该项目的分析。
  • 单击创建项目
  • 单击代码按钮
  • 输入应用程序的名称,然后单击“注册应用”按钮
  • 单击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=””

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

config.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,
  },
};

firebase.js

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

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

const firebase = initializeApp(config.firebaseConfig);

export default firebase;

创建Express Server(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}`),
);

如果我们运行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;

构建Crud功能(控制器)

CRUD代表创建,阅读,更新和删除。这些是构建API的基础。

在控制器文件夹中,创建一个名为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);

创建产品功能:

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);
  }
};

获取所有产品功能:

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);
  }
};

通过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);
  }
};

通过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);
  }
};

最后,删除产品功能:

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);
  }
};

路线

在我们的路线文件夹中,创建一个名为produttroute.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;

为了访问此路线,我们必须更新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}`),
);

运行服务器

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

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

"start": "nodemon index.js"

之后,在我们的终端中,我们可以使用:

运行服务器命令

npm start

您现在可以使用Postman来确保您的API工作正常,还可以在Firestore数据库中查看创建的文件。

快乐的编码。