介绍
在本文中,我们将研究如何使用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数据库中查看创建的文件。
快乐的编码。