仍是不會Mongodb安裝和基礎功能?細化過程後咱們再來看一看!

第一次在掘金寫文章很緊張,因而決定...說一小段前言來緩解一下!

我相信有不少同志都很想邁入全棧一行,不只僅是由於興趣,同時也有需求但願更加的學習。
因而乎在百度了各類各樣的教程視頻,學習資料後,咱們確定會找上這麼一項技術,也就是這篇文章的核心:

1、什麼是Mongodb?它可以爲咱們帶來如何的便利?

1.1 什麼是Mongodb?

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。在高負載的狀況下,添加更多的節點,能夠保證服務器性能。前端

1.2 它可以爲咱們帶來如何的便利?

MongoDB帶來的好處太多了,如下列舉幾條:node

  1. MongoDB 是一個面向文檔存儲的數據庫,操做起來比較簡單和容易。
  2. Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  3. 你能夠在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  4. 你能夠經過本地或者網絡建立數據鏡像,這使得MongoDB有更強的擴展性。

👌不列舉缺點,不是沒有,只是以爲...一會吹一會損的不太人道(哈哈哈)網上關於這方面的不少,其實要總結的話那就太長了,因而這裏就不一一舉例了。git


2、第一步,搭建Mongodb,爲以後的操做作好充分準備。

如下文件路徑皆以我本身Mac上的爲例子,你們能夠自行配置。github

這裏使用的homebrew安裝方式來進行安裝mongodb

2.1 打開終端命令行,輸入如下代碼:

brew install mongodb
複製代碼

安裝完成後咱們在當前終端看看我們有沒有安裝成功:數據庫

mongod -h
複製代碼

安裝完成後指定一處數據路徑和日誌路徑,由於你總要把數據以及日誌放在一個地方對吧?express

2.2 指定一處數據路徑和日誌路徑。

在桌面新建一個Mongodb文件,完成後cd進入該文件,在Mongodb文件內建立一個名爲data的文件夾,這即是咱們指定的數據路徑和日誌路徑存放的地方了,輸入如下代碼:npm

mongod -dbpath="./data"
複製代碼

當咱們出現下圖這樣的顯示後,很開心的告訴你,我們的前戲成了,能夠開GTR了👌: json

這個窗口不能關閉,由於當前此終端命令行至關於mongodb的服務了,關閉它,跟中止mongodb的服務沒啥區別了。後端


OK,我們總結一下知識點,這兩步操做具體都作了什麼。
  1. 第一步經過brew的方式下載了mongodb,與其餘安裝不一樣的是,我選擇了命令行安裝而不是下載官方的解壓包進行安裝。

  2. 安裝完成後,理所固然的,既然是數據庫那麼確定有數據和日誌,咱們須要讓它們 被咱們指定到一個地方,好進行管理和之後的一些操做,而幫咱們指定存放點的代碼就是 mongod -dbpath="你本身的路徑"

3、第二步,讓你看到數據的可視化工具?不,一個網頁便可。

數據庫咱們已經搭好了,如何才能看到咱們的數據庫中的數據?

還記得剛纔第一步當中的建立的Mongodb文件嗎?新建一個終端 cd 到當前Mongodb下,輸入神祕代碼:

mongo

執行代碼後:

看到這裏你們估計都知道了,mongodb能夠經過命令查詢數據。


列舉五個經常使用的命令:
  1. show dbs(查詢全部數據庫列表)
  2. db(查看當前鏈接哪一個數據庫)
  3. use 數據庫名字 (切換到某個數據庫下面)
  4. show collections (查看當前數據庫下有哪些表)
  5. db.help() (當前數據庫支持方法)

固然Mongodb命令行是有查詢語句的(沒有就奇怪了),爲何不列舉?是由於咱們有一個更好的工具:adminMongo

adminMongo 是一個 Mongodb的可視化工具,輕巧,便攜,可知足平常開發的基礎工具

npm install admin-mongo
npm i 
npm start
複製代碼

👌下載三連,你們都懂了吧,GTR開的可快了吧👌

說回正題,下載完成後,啓動項目咱們能夠看見界面呈這樣的:

在這裏咱們能夠進行一些建立庫,刪除庫,建立表等等之類的操做。

3.1 建立一條用戶數據

以我本身的nextHuafo數據庫爲例點擊右邊nextHuafo來到當前數據庫的總頁面:

在此處建立一張users表:

在當前users表中插入一條用戶數據:

👌大功告成,咱們的第一條數據就這麼插入成功了。

👌若是你到這就已經很開心了,甚至很興奮,咱們不妨把車速提上一個檔次,接下來,就該先後端開始聯動了。

4、第三步,萬事俱備,只欠東風,是時候開始聯動(請求)數據了。

4.1 搭建項目並下載express or mongoose。

npm install express

npm install mongoose

用express來管理後面咱們寫好接口的路由最合適不過了(因此我這標題是否是該叫express+Mongodb..)

mongoose是在node.js異步環境下對mongodb進行便捷操做的對象模型工具

下載好後來看一下個人項目配置,這裏我爲了方便採用了VueCli3.0來直接構建的項目,如下爲項目路徑:

👌在這裏咱們新建一個server文件來存放對於數據庫的一些操做,那麼在接下來的步驟前,我但願可以爲你們先理一下總體思路。

咱們須要作五步操做:

  1. 鏈接數據庫。
  2. 建立數據模塊Model,編寫須要的業務功能代碼。
  3. 獲取請求參數,代入寫好的功能中進行條件返回。
  4. 設置express路由,經過路由的方式把當前方法變成咱們能夠請求的接口。
  5. postman進行查詢。

4.2 鏈接數據庫

在 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
複製代碼

4.3 建立數據模塊Model,編寫須要的業務功能代碼。

在 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準備奔馳起來了!。

4.4 獲取請求參數,代入寫好的功能中進行條件返回。

這就是查詢方法了,咱們先不去深追究這個,咱們接下來,再建立一個 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,
}
複製代碼

4.5 設置express路由,經過路由的方式把當前方法變成咱們能夠請求的接口。

在 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   //啓動起來
複製代碼

4.6 總結 3 . 4 . 5 步驟具體都在幹什麼。

好了,我們代碼也看了這麼多了,是時候來講一下他們爲何都要這麼寫。

以前的查詢方法爲何叫它查詢方法?是由於 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 關聯一下就好了。

4.7 postman進行查詢。

跑也跑起來了,寫也寫得差很少了,是時候監測一下本身的代碼是不是正確的了,打開 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!嘿嘿嘿

github.com/FuhanLXK/Sh…

那麼,Mongodb 到這也就所有結束了,寫了兩天,由於本身第一次發文章因此不少都不熟悉,我做爲一個完全的前端碼仔,寫卻是會寫,說出來的話可能就徹底不專業了。

看了看大佬的文章和本身的這篇,差距感頓時就出來了,不過我依然感到興奮,由於對於本身,我終因而邁出了這一步。

若是文中有錯誤,或者不仔細的地方,你們積極對我提出意見,我也須要成長,也會積極的去修改。

立刻就要滿20了,但願本身能永遠保持這份激情。

願各位始終擁有光亮,不害怕,形單影隻亦使前程輝煌。

相關文章
相關標籤/搜索