1. 程式人生 > 其它 >② nodejs + mongodb 搭建伺服器

② nodejs + mongodb 搭建伺服器

搭建本地伺服器

  1. 引入第三方模組 express

  2. 利用 express 建立一個伺服器

  3. 搭建靜態資源伺服器

  4. 引入路由總中介軟體

  5. 使用路由總中介軟體

  6. 監聽伺服器開啟

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