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
地址 -
27017
是mongodb
的服務啟動埠 -
infos
是mongodb
的一個資料集合名字-
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
中,每一個資料欄位都要有固定的資料型別,所以Schema
在mongoose
中的意思為,每一張資料表對應的欄位的資料型別
-
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 程式碼分析
- 需要熟練使用
Express
的router
方法 - 引入
Express
,定義一個post
方法 -
post
方法傳遞的物件資料掛在在req.body
上 - 直接呼叫
operate.save()
方法,傳遞param
物件引數 - 獲取到返回結果
result
,對獲取到的結果進行進一步處理