node中引入mongoose后创建数据库对应的模型层,控制层目录结构(php也是类似的结构)
模型层
在模型层中建立.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())