天天看點

koa架構中的mongoose

node中引入mongoose後建立資料庫對應的模型層,控制層目錄結構(php也是類似的結構)

koa架構中的mongoose

模型層

在模型層中建立.js檔案。

const Mongoose = require('mongoose')
var user = new Mongoose.Schema({//Schema要執行個體化mongoose
    user: String,
    age: {
        type: Number,
        validate: {//驗證器
            validator: function (v) {
                if (v > 30) {
                    return false
                }
            },
            message: '年齡不能大于30'
        },
        required: true//必要資料器
    },
    inter: Object
})
module.exports = Mongoose.model('user',user)//model不用執行個體化mongoose
           

這是一個簡單是mongoose的模型,每一個模型都是有Schema開始的。每個Schema就是一個資料庫的collections集合(表),

執行個體化Mongoose.Schema後可以定義集合中的每個字段。比如age:

type:對應字段的資料類型

validate:驗證字段是否符合特定的要求

required:代表字段是必須的

最後将模型通過mongoose上的model建立模型并暴露出來讓控制層引用,model中的名字最後會對應資料庫中的每一個表,隻是資料庫中對應的表名會多一個s

控制層

控制層主要負責邏輯部分包括資料庫的增删改查等操作。

const user = require('../model/user')
var data = {
    user: '測試名字',
    age: 18,
    inter: {
        sport: 'football',
        eat: 'apple'
    }
}
exports.insert = function (ctx) {
    user.create(data,(err,res) => {
        if (err) {
            console.log(err)
        } else {
            console.log(res)
            ctx.body = {//資料庫操作的回調中定義ctx無效
                code: 200
            }
        }
    })
    //ctx.body不能放到資料庫操作的回調中不然不能設定成功
    ctx.body = {
        code: 200
    }
}
           

控制層中可以把項目對應的方法全部丢到一個檔案裡面然後将對應的每個方法按照exports.方法名的方式暴露出來給路由。

上面是一個插入資料庫的方法。

路由檔案

const router = require('koa-router')()
const user   = require('../app/controllers/user')//入口檔案掉用路由,路由調用controllers層,controllers層調用model層
router.get('/insertData',user.insert)//引用封裝好的controllers層的方法
module.exports = router
           

http://localhost:3030/insertData就是對應的給前端的接口

說到這裡順便說一下路由的一個使用技巧

router.get('/insertData',async function (ctx,next) {
    if (10 > 5) {
        next()
    } else {
        return
    }
},user.insert)
           

router中可以放入多個方法,執行的順序是從左到右。上面這段代碼因為10大于5執行了next()方法可以接下去執行下user.insert方法,但是如果沒有執行next()那麼就不會執行user.insert

這個router的機制可以作為一種驗證方式,對于需要驗證token的接口來說是福音。

入口檔案

const routerIndex= require('./router/routerIndex')          //路由執行個體app.use(routerIndex.routes(),routerIndex.allowedMethods())