MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。在高負載的狀況下,添加更多的節點,能夠保證服務器性能。前端
MongoDB帶來的好處太多了,如下列舉幾條:node
👌不列舉缺點,不是沒有,只是以爲...一會吹一會損的不太人道(哈哈哈)網上關於這方面的不少,其實要總結的話那就太長了,因而這裏就不一一舉例了。git
如下文件路徑皆以我本身Mac上的爲例子,你們能夠自行配置。github
這裏使用的homebrew安裝方式來進行安裝mongodb
brew install mongodb
複製代碼
安裝完成後咱們在當前終端看看我們有沒有安裝成功:數據庫
mongod -h
複製代碼
安裝完成後指定一處數據路徑和日誌路徑,由於你總要把數據以及日誌放在一個地方對吧?express
在桌面新建一個Mongodb文件,完成後cd進入該文件,在Mongodb文件內建立一個名爲data的文件夾,這即是咱們指定的數據路徑和日誌路徑存放的地方了,輸入如下代碼:npm
mongod -dbpath="./data"
複製代碼
當咱們出現下圖這樣的顯示後,很開心的告訴你,我們的前戲成了,能夠開GTR了👌: json
這個窗口不能關閉,由於當前此終端命令行至關於mongodb的服務了,關閉它,跟中止mongodb的服務沒啥區別了。後端
第一步經過brew的方式下載了mongodb,與其餘安裝不一樣的是,我選擇了命令行安裝而不是下載官方的解壓包進行安裝。
安裝完成後,理所固然的,既然是數據庫那麼確定有數據和日誌,咱們須要讓它們 被咱們指定到一個地方,好進行管理和之後的一些操做,而幫咱們指定存放點的代碼就是 mongod -dbpath="你本身的路徑"
數據庫咱們已經搭好了,如何才能看到咱們的數據庫中的數據?
還記得剛纔第一步當中的建立的Mongodb文件嗎?新建一個終端 cd 到當前Mongodb下,輸入神祕代碼:
mongo
執行代碼後:
看到這裏你們估計都知道了,mongodb能夠經過命令查詢數據。
固然Mongodb命令行是有查詢語句的(沒有就奇怪了),爲何不列舉?是由於咱們有一個更好的工具:adminMongo
adminMongo 是一個 Mongodb的可視化工具,輕巧,便攜,可知足平常開發的基礎工具
npm install admin-mongo
npm i
npm start
複製代碼
👌下載三連,你們都懂了吧,GTR開的可快了吧👌
說回正題,下載完成後,啓動項目咱們能夠看見界面呈這樣的:
在這裏咱們能夠進行一些建立庫,刪除庫,建立表等等之類的操做。
以我本身的nextHuafo數據庫爲例點擊右邊nextHuafo來到當前數據庫的總頁面:
在此處建立一張users表:
在當前users表中插入一條用戶數據:
👌大功告成,咱們的第一條數據就這麼插入成功了。
👌若是你到這就已經很開心了,甚至很興奮,咱們不妨把車速提上一個檔次,接下來,就該先後端開始聯動了。
npm install express
npm install mongoose
用express來管理後面咱們寫好接口的路由最合適不過了(因此我這標題是否是該叫express+Mongodb..)
mongoose是在node.js異步環境下對mongodb進行便捷操做的對象模型工具
下載好後來看一下個人項目配置,這裏我爲了方便採用了VueCli3.0來直接構建的項目,如下爲項目路徑:
👌在這裏咱們新建一個server文件來存放對於數據庫的一些操做,那麼在接下來的步驟前,我但願可以爲你們先理一下總體思路。
咱們須要作五步操做:
在 server 文件夾下新建一個 Connection.js 文件用於鏈接數據庫,在當前js中,咱們須要用到以前咱們下載的 mongoose 進行鏈接並使用 mongoose.connect (鏈接數據庫方法) 進行數據庫鏈接,
var mongoose = require('mongoose')
/**** 聲明本身的Mongodb數據庫本地連接 *****/
var mongooseUrl = 'mongodb://127.0.0.1:27017/nextHuafo'
/**** 連接 *****/
mongoose.connect(mongooseUrl, {useNewUrlParser: true}, (err) => {
if(err){
console.log('Connection Error:' + err)
}else{
console.log('Connection success!') }
})
複製代碼
使用 mongoose.connection.on('connected') 來監聽本身數據庫到底有沒有鏈接成功。
mongoose.connection.on('connected',()=>{
console.log('數據庫鏈接成功')
})
複製代碼
或者你也能夠監聽一下鏈接失敗
mongoose.connection.on('err',()=>{
console.log('數據庫鏈接失敗')
})
複製代碼
而後咱們把咱們鏈接好的 mongoose 導出。
module.exports = mongoose
複製代碼
最後鏈接數據庫的 Connection.js 就是這樣的:
var mongoose = require('mongoose')
var mongooseUrl = 'mongodb://127.0.0.1:27017/nextHuafo'
mongoose.connect(mongooseUrl, {useNewUrlParser: true}, (err) => {
if(err){
console.log('Connection Error:' + err)
}else{
console.log('Connection success!') }
})
/******連接成功*******/
mongoose.connection.on('connected',()=>{
console.log('數據庫鏈接成功')
})
/******連接失敗*******/
mongoose.connection.on('err',()=>{
console.log('數據庫鏈接失敗')
})
module.exports = mongoose
複製代碼
在 server 文件下咱們建立一個Schema文件,這個文件用於存放咱們針對不一樣模塊所寫的不一樣的業務功能代碼以及對應模塊數據模型,先看一眼目前的目錄吧:
在 Schema 文件下建立咱們此次須要的用戶文件名爲 user 並在其目錄下建立 user.js :
好了,這就是咱們所說的模型文件 Schema 了,稍微來講一下 Schema 吧。
schema 是 mongoose 裏會用到的一種數據模式,能夠理解爲表結構的定義;每一個 schema 會映射到 mongodb 中的一個 collection ,它不具有操做數據庫的能力
在 mongoose 裏一切都由 schema 開始。每個 schema 對應一個 mongoDB collection 而且在那個 collection 裏面定義了 documents 的模型。
👌總結一下,這裏可能就用一句話歸納:
schema 不具有操做數據庫的能力,它是爲了定義當前 collection 表結構的一種數據模型。
在user.js中引入剛剛咱們定義的鏈接數據庫文件。
const mongoose = require('./server/Connection.js') //不是真實路徑,根據本身條件修改
複製代碼
而後來定義一個 Schema 模型。
const User = mongoose.model('user',{
username:String,
password:String,
isLogin:Boolean
})
複製代碼
model () 是爲了讓咱們能夠把已經定義好的 Schema 轉換成咱們可使用的 model
上面的方法等同於:
var userSchema = new Schema({ // Schema頭字母大寫,由於Schema是構造函數
username: String,
password: String,
isLogin: String,
});
var User = mongoose.model('user', userSchema);
複製代碼
注意! mongoose 在這裏會自動給你加上覆數,也就是說這裏的 model( 'user' , {} ) 等於 model( ' users ' , { } ) 必定要注意這個細節。
好了👌,關於users,咱們已經定義好了,如今該作的,就是寫咱們須要的users 方法了,咱們就先寫一個簡單的查詢吧!
仍是剛剛的 user.js 繼續在這文件裏寫。
//查詢方法
const findUser = (userInfo, callback) => {
User.findOne(userInfo).then((res) => {
callback(res)
})
}
//導出
module.exports = {
findUser
}
複製代碼
接下來會很是快速的進行3.4.5流程的歸納,而後在總結,GTR準備奔馳起來了!。
這就是查詢方法了,咱們先不去深追究這個,咱們接下來,再建立一個 userApi.js 的文件並引入剛剛的 user.js
const userModel = require('./user')
複製代碼
繼續,咱們編寫當請求接收後,根據數據庫返回的條件進行前端返回的提示信息。
const login = (req, res) => {
let {username, password,status} = req.body
userModel.findUser({username}, (user) => {
if (!user) {
res.json({
code: 201,
msg: '用戶名不存在'
})
} else {
if (user.password == password) {
res.cookie('user', username)
res.json({
code: 200,
msg: '登陸成功!'
})
} else {
res.json({
code: 202,
msg: '密碼錯誤'
})
}
}
})
}
//導出login方法
module.exports = {
login,
}
複製代碼
在 user.js 的上一級,咱們新建一個 router.js 文件 用於存放express路由,而當咱們請求這些路由的時候,也就是在請求咱們寫的方法。
var express = require('express') //引入express
var router = express.Router() //定義express路由
var userController = require('./user/userApi') //引入剛剛的userApi.js
router.post('/login', userController.login) //經過路由的方式去請求咱們寫好的接收方法
//導出當前路由
module.exports = router
複製代碼
這個時候我們的工做就作的七七八八了,可是我們總得跑起來吧!這麼一項堅定的工做,就交給 express 中間件了,在最外層建立 app.js 中間件,並在中間件裏建立 3030 端口,使用app.use() 方法將剛剛導出的路由關聯起來,而後這事我們也就算成了,來試試吧。
var express = require('express');
var cors = require('cors');
var app = express()
var mongoose = require('mongoose');
const bodyPaser = require('body-parser');
app.use(cors());
// app.use(bodyPaser.json) //在其餘路由中間件前(儘量靠前,以可以經過bodyPaser獲取req.body)
// app.use(bodyPaser.urlencoded({ extended: false}))
app.use(bodyPaser.urlencoded({extended:true}));
app.get('/',function(req,res){
res.send("啓動成功")
})
var usersRouter = require('./server/SchemaApi/router')
app.use('/api/user',usersRouter)
app.listen(3030,() => {
console.log("node 3030端口成功")
})
複製代碼
node app.js //啓動起來
複製代碼
好了,我們代碼也看了這麼多了,是時候來講一下他們爲何都要這麼寫。
以前的查詢方法爲何叫它查詢方法?是由於 findOne()。
const findUser = (userInfo, callback) => {
User.findOne(userInfo).then((res) => {
callback(res)
})
}
複製代碼
findOne ( ) 方法,findOne是返回符合條件的第一條記錄
這其實就是 mongodb 提供的方法,在這裏findOne ( ) 接收一個userInfo 參數 。
👌OK,咱們繼續,userApi.js 裏爲何會寫接收請求的方法?
還記得咱們的router.js嗎?經過express的路由,來請求當前的文件,若是仍是沒有頭緒咱們再來看看這條代碼。
var userController = require('./user/userApi')
router.post('/login', userController.login)
複製代碼
結合 userApi.js的代碼 來看:
const login = (req, res) => {
let {username, password,status} = req.body
userModel.findUser({username}, (user) => {
if (!user) {
res.json({
code: 201,
msg: '用戶名不存在'
})
} else {
if (user.password == password) {
res.cookie('user', username)
res.json({
code: 200,
msg: '登陸成功!'
})
} else {
res.json({
code: 202,
msg: '密碼錯誤'
})
}
}
})
}
module.exports = {
login
}
複製代碼
顯而易見的,在 router.js 中 router.post ( ) 請求的正是導出的login方法,login方法接收兩個參數,req和res。而咱們的請求參數 即是 req.body。
到這裏咱們 express 路由便寫好了,接下來只須要在中間件使用 app.use 關聯一下就好了。
跑也跑起來了,寫也寫得差很少了,是時候監測一下本身的代碼是不是正確的了,打開 postman 咱們來檢測一下本身的接口吧,同時也要看本身啓動中間的終端哦!
???怎麼回事?竟然報錯了?我寫了這麼大半天!你竟然報錯了!辣雞文章我要舉報你!假的!
當咱們碰見這個問題時,看他報的什麼錯。
Cannot destructure property
username
of 'undefined' or 'null'.
這裏請你們注意:
express4.0當中 req.body 被剝離出來了須要在app.js手動引入一下才能解析req.body
const bodyPaser = require('body-parser');
app.use(bodyPaser.urlencoded({extended:true}));
複製代碼
在這兩句代碼加入你的app.js,若是沒有 body-parser ,也能夠 npm 下載一下(順帶說一句,我曾經把body-parser 寫做 body-praser, 而後在那裏糾結了半小時爲啥我沒有該模塊...)
👌OK,如今咱們重啓剛剛的node app.js 終端,而後 postman 請求一下,看能否正常運行了。
大功告成!👌,如此一來,最爲基本的mongodb操做方法咱們就已經說完了。其實也如此簡單,是否是沒有想象中這麼難?最後看看個人目錄吧:
最後這項目也在 github 上,我新加了一些東西,你們能夠看這個,求個star!嘿嘿嘿
那麼,Mongodb 到這也就所有結束了,寫了兩天,由於本身第一次發文章因此不少都不熟悉,我做爲一個完全的前端碼仔,寫卻是會寫,說出來的話可能就徹底不專業了。
看了看大佬的文章和本身的這篇,差距感頓時就出來了,不過我依然感到興奮,由於對於本身,我終因而邁出了這一步。
若是文中有錯誤,或者不仔細的地方,你們積極對我提出意見,我也須要成長,也會積極的去修改。
立刻就要滿20了,但願本身能永遠保持這份激情。
願各位始終擁有光亮,不害怕,形單影隻亦使前程輝煌。