② nodejs + mongodb 搭建伺服器
阿新 • • 發佈:2021-10-25
搭建本地伺服器
-
引入第三方模組 express
-
利用 express 建立一個伺服器
-
搭建靜態資源伺服器
-
引入路由總中介軟體
-
使用路由總中介軟體
-
監聽伺服器開啟
- server.js
// 001 引入第三方模組 const express = require('express'); // 002 利用express建立一個伺服器 const app = express(); // 003 搭建靜態資源伺服器 app.use(express.static('/')) const { PORT } = require('./config.json'); // 004 引入路由總中介軟體 const allRouter = require('./routers'); // 005 使用路由總中介軟體 app.use(allRouter); // 006 監聽伺服器開啟 app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); })
配置請求路徑
- router/index.js
const express = require('express'); let Router = express.Router(); let loginRouter = require('./login'); let goodsRouter = require('./goods'); let userRouter = require('./user'); let regRouter = require('./reg'); Router.use(express.json(), express.urlencoded({ extended: true })); Router.use('./login', loginRouter); Router.use('./goods', goodsRouter); Router.use('./user', userRouter); Router.use('./reg', regRouter); module.exports = Router;
統一前後端的資料格式
- utils/index.js
// 解構預設值 function formatData({status = 200, data = [], msg = '操作成功'} = {}) { if(status === 0) { msg = "fail"; } return { status, data, msg } } module.exports = { formatData }
連線資料庫
- src/db/mongodb.js -- 初版
const { MongoClient } = require('mongodb');
const { dbUrl, dbName } = require('../config.json');
// 連線MongoDB資料庫
async function connect() {
const client = await MongoClient.connect(dbUrl);
const db = client.db(dbName);
return {
client,
db
}
}
/**
* 增 -- 註冊
* @param {String} colName 集合名稱
* @param {Array|Object} data 插入的資料
* return {Object} 返回寫入的結果
*/
async function create(coleName, data) {
const { db, client } = await connect();
let collection = db.collection(colName);
// 判斷傳入的Data是否為陣列
if(!Array.isArray(data)) {
data = [data]
}
let result = await collection.insertMany(data);
client.close();
return result;
}
/**
*刪除
*@param{String}colName集合名稱
*@param{Object}query查詢條件
*/
asyncfunctionremove(colName,query){
const{ db,client }=awaitconnect();
letcollection=db.collection(colName);
letresult=awaitcollection.deleteMany(query);
client.close();
returnresult;
}
/**
*更新
*@param{String}colName集合名稱
*@param{Object}query查詢條件
*@param{Object}data更新欄位資料
*/
asyncfunctionupdate(colName,query,data){
const{ db,client }=awaitconnect();
letcollection=db.collection(colName);
letresult=awaitcollection.updateMany(query,{ $set:data });
client.close();
returnresult;
}
/**
*查
*@param{String}colName集合名稱
*@param{Object}query查詢條件
*/
asyncfunctionfind(colName,query){
const{ db,client }=awaitconnect();
letcollection=db.collection(colName);
//promise物件--.toArray()才能拿到結果
letresult=awaitcollection.find(query).toArray();
client.close();
returnresult;
}
// 模組開發思想--匯出模組
module.exports = {
create,
remove,
update,
find
}
- 增強版查詢 --查詢條件
/**
*查
*@param{String}colName集合名稱
*@param{Object}query查詢條件
*/
asyncfunctionfind(colName,query){
const{ db,client }=awaitconnect();
letcollection=db.collection(colName);
//處理id查詢{_id:'xxx'}->{_id:ObjectId('xxx')}
if(query._id&&typeofquery._id==='string'){
query._id=Object(query._id);
}
//promise物件--.toArray()才能拿到結果
letresult=awaitcollection.find(query).toArray();
client.close();
returnresult;
}
- 增強版查詢--過濾
/**
*查
*@param{String}colName集合名稱
*@param{Object}query查詢條件
*@paramfields過濾欄位
*/
asyncfunctionfind(colName,query={},{ fields }={}){
const{ db,client }=awaitconnect();
letcollection=db.collection(colName);
if(query._id&&typeofquery._id==='string'){
query._id=Object(query._id);
}
//promise物件--.toArray()才能拿到結果
letresult=awaitcollection.find(query,{ fields }).toArray();
client.close();
returnresult;
}
請求路徑模組--方法編寫
- user.js
const express = require('express');
const Router = express.Router();
const { find, remove, update } = require('../db/mongodb');
const { formatData } = require('../utils');
const colName = 'user';
// 查詢所有使用者
Router.get('/', async (req, res) => {
// 查詢資料庫
let result = await find(colName);
res.send(formatData({ data: result }))
})
// 查詢單個使用者資訊
Router.get('/:id', async (req, res) => {
let { id } = req.params;
let result = await find(colName, { _id: id }, { fields: { password: false, _id: false }});
res.send(formatData({ data: result }));
})
// 刪除使用者
Router.delete('/:id', async (req, res) => {
let { id } = req.params;
let result = await remove(colName, { _id: id });
if(result.deleteCount > 0) {
res.send(formatData());
} else {
res.send(formateData({ status: 0 }));
}
})
// 修改使用者資訊
Router.patch('/:id', async (req, res) => {
let {id} = req.params;
let {password, age, gender} = req.body;
let result = await update(colName, { _id: id }, { password, age, gender });
if(result.modifiedCound > 0) {
res.send(formatData());
} else {
res.send(formateData({ status: 0 }));
}
})
module.exports = Router;
實現分頁
- mongodb.js
/**
*查
*@param{String}colName集合名稱
*@param{Object}query查詢條件
*@paramdptions可選引數
*/
asyncfunctionfind(colName,query={},options={}){
// fields: 用於過濾某些欄位
let { fields: attr, skip, limit, sort } = options;
const{ db,client }=awaitconnect();
letcollection=db.collection(colName);
if(query._id&&typeofquery._id==='string'){
query._id=Object(query._id);
}
//promise物件--.toArray()才能拿到結果
letresult=awaitcollection.find(query, { attr });
// 跳過數量
if(skip) {
result = result.skip(skip);
}
// 限制數量
if(limit) {
result = result.limit(limit * 1);
}
// 排序 1-->升序 -1-->降序
if(sort) {
let arr = sort.split(',')
let key = arr[0];
let value = arr[1] ? arr[1] * 1 : -1;
result = result.sort({
[key]: value
})
}
client.close();
returnresult;
}
- goods.js
// 編寫介面資料
const colName = 'goods';
// 查詢所有商品
Router.get('/', async (req, res) => {
let { page =1, size = 10, sort } = req.query;
let index = (page - 1) * size;
let data = await mongodb.find(colName, {}, { skip: index, limit: size, sort });
res.send(formatData({ data }));
})