使用 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=””
使用在 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,
},
};
Firebase.js
在 firebase.js 文件中添加以下代码来初始化我们的数据库:
import { initializeApp } from 'firebase/app';
import config from './config.js';
const firebase = initializeApp(config.firebaseConfig);
export default firebase;
创建 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}`),
);
如果我们运行,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 的基础。
在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);
创建产品功能:
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);
}
};
路线
在我们的 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;
为了访问此路线,我们必须更新 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 数据库中创建的文件。
结论
在本文结束时,您应该能够使用 firebase 创建一个可运行的 Nodejs 服务器。
这是github 上的源代码链接。
祝您编码愉快。
鏂囩珷鏉ユ簮锛�https://dev.to/ibukunfolay/build-a-nodejs-server-using-firebasefirestore-crud-2725