Node.js學習之路23——Node.js利用mongoose連線mongodb資料庫

Karuru發表於2019-02-16

Node.js利用mongoose連線mongodb資料庫

Node.js連線mongodb資料庫有很多種方法,通過mongoose模組引入是其中的一個方法

  • 程式碼組織結構
|---|根目錄
|---|---|connect.js(mongoose測試連線)
|---|---|user.js(定義user資料表)
|---|---|operate.js(定義mongodb的增刪改查功能)
|---|---|login.js(Node後臺呼叫operate.js檔案的方法處理資料)

1. 引入mongoose測試連線

當前使用的mongoose版本為4.13.7

  • 該檔案為connect.js

1.1 程式碼部分

const mongoose = require("mongoose");
const DB_URL = "mongodb://127.0.0.1:27017/infos";
mongoose.Promise = global.Promise;
mongoose.connect(DB_URL, { useMongoClient: true });
mongoose.connection.on("connected", () => {
    console.log("mongodb資料庫連線成功")
});
mongoose.connection.on("error", (error) => {
    console.log("mongodb資料庫連線失敗", error)
});
module.exports = mongoose;

1.2 程式碼分析

1.2.1 引入mongoose模組

  • const mongoose = require("mongoose");

1.2.2 獲取mongodb的本機地址

  • const DB_URL = "mongodb://127.0.0.1:27017/infos";
  • 127.0.0.1是本地IP地址
  • 27017mongodb的服務啟動埠
  • infosmongodb的一個資料集合名字

    • mongodb可以有很多資料集合,每個集合中可以有很多資料表。
    • 類比一下:你有一個巨型停車場(mongodb),裡邊分了不同的停車區(集合,這裡的infos),每個停車區可以停很多車((下文提到的user),相當於每個資料集合裡邊可以有很多張資料表)。
  • 如果需要給mongodb加上使用者及密碼,可以這樣

    • const DB_URL = "mongodb://username:password@127.0.0.1:27017/infos";
    • 其中username為使用者名稱,中間英文:password為密碼,其餘不變

1.2.3 連線資料庫成功

  • mongoose.connection.on("connected", callback())
  • 資料庫連線成功後,會在控制檯輸出mongodb資料庫連線成功

1.2.4 連線資料庫失敗

  • mongoose.connection.on("error", callback())
  • 資料庫連線成功後,會在控制檯輸出mongodb資料庫連線失敗和錯誤資訊

1.2.5 匯出mongoose模組

  • module.exports = mongoose;

2. 定義每張資料表的欄位

  • 該檔案為user.js

2.1 程式碼介紹

const mongoose = require(`mongoose`);
const db = require(`./connect.js`);
const userSchema = new mongoose.Schema({
    number: { type: Number},
    email: { type: String },
    password: { type: String },
    rePassword: { type: String },
    mobile: { type: String },
    question: { type: String },
    answer: { type: String },
});
let userModel = db.model(`user`, userSchema);
module.exports = userModel;

2.2 程式碼分析

2.2.1 引入mongoose模組

  • const mongoose = require("mongoose");

2.2.1 引入連線mongodb資料庫的模組

  • const db = require(`./connect.js`);

2.2.2 定義Schema

  • const userSchema = new mongoose.Schema({})
  • 通過mongoose物件的Schema屬性建立一個Schema物件

Schema原意為架構
mongodb中,每一個資料欄位都要有固定的資料型別,所以Schemamongoose中的意思為,每一張資料表對應的欄位的資料型別

  • Schema所能夠擁有的資料型別有以下幾個

    • String
    • Number
    • Date
    • Buffer
    • Boolean
    • Mixed
    • ObjectId
    • Array
  • 欄位介紹,以number欄位為例

    • type是該欄位的資料型別
    • default是該欄位的預設值
    • 還有很多其他的屬性,以及可以自定義屬性

2.2.3 確認資料表和該資料表的欄位

  • let userModel = db.model(`user`, userSchema);
  • 定義一個資料表userModel
  • 使用db.model方法,第一個引數是資料表的名字,第二個引數是該資料表使用的Schema

2.2.4 最終匯出定義的資料表

  • module.exports = userModel;
  • 匯出之後,在operate.js中使用這個物件的mongodb的增刪改查方法

3. 定義mongodb的增刪改查功能

3.1 程式碼部分

  • 該檔案為operate.js
let userModel = require(`./user.js`);
module.exports = {
    save(data) {
        return new Promise((resolve, reject) => {
            userModel.create(data, (err, docs) => {
                if (err) {
                    rejct(err);
                } else {
                    resolve(docs);
                }
            })
        })
    },
    find(data = {}, fields = null, options = {}) {
        return new Promise((resolve, reject) => {
            //model.find(需要查詢的物件(如果為空,則查詢到所有資料), 屬性過濾物件[可選引數], options[可選引數], callback)
            userModel.find(data, fields, options, (error, doc) => {
                if (error) {
                    reject(error)
                } else {
                    resolve(doc)
                }
            })
        })
    },
    findOne(data) {
        return new Promise((resolve, reject) => {
            //model.findOne(需要查詢的物件,callback)
            userModel.findOne(data, (error, doc) => {
                if (error) {
                    reject(error)
                } else {
                    resolve(doc)
                }
            })
        })
    },
    findById(data) {
        return new Promise((resolve, reject) => {
            //model.findById(需要查詢的id物件 ,callback)
            userModel.findById(data, (error, doc) => {
                if (error) {
                    reject(error)
                } else {
                    resolve(doc)
                }
            })
        })
    },
    update(conditions, update) {
        return new Promise((resolve, reject) => {
            //model.update(查詢條件,更新物件,callback)
            userModel.update(conditions, update, (error, doc) => {
                if (error) {
                    reject(error)
                } else {
                    resolve(doc)
                }
            })
        })
    },
    remove(conditions) {
        return new Promise((resolve, reject) => {
            //model.update(查詢條件,callback)
            userModel.remove(conditions, (error, doc) => {
                if (error) {
                    reject(error)
                } else {
                    resolve(doc)
                }
            })
        })
    }
};

3.2 程式碼分析

  • 引入user模組
  • let userModel = require(`../models/users`);
  • 引入該檔案的目的是,讓userModel這個資料表直接的呼叫mongodb的各種方法

4. 後臺直接使用operate處理資料

  • 該檔案為login.js

4.1 程式碼部分

const express = require(`express`);
const router = express.Router();
let operate = require(`./operate`);
router.post(`/`, function (req, res, next) {
    let param = {};
    param.email = req.body.email;
    param.password = req.body.password;
    console.log(param);
    operate.save(param).then(result => {
        if (result) {
            res.json({
                data: result,
                success: true
            })
        } else {
            res.json({
                data: result,
                success: false
            })
        }
    });
});
module.exports = router;

4.2 程式碼分析

  • 需要熟練使用Expressrouter方法
  • 引入Express,定義一個post方法
  • post方法傳遞的物件資料掛在在req.body
  • 直接呼叫operate.save()方法,傳遞param物件引數
  • 獲取到返回結果result,對獲取到的結果進行進一步處理

相關文章