1、安装
cnpm install koa --save //koa安装
cnpm install koa-bodyparser --save //koa的参数解析中间件
cnpm install koa2-cors --save //koa的跨域中间件
cnpm install koa-router --save //koa的路由映射
cnpm install mongodb --save //mongodb
cnpm install mongoose --save //mongoose
//package.json
{
"dependencies": {
"koa": "^2.5.0",
"koa-bodyparser": "^4.2.0",
"koa-router": "^7.4.0",
"koa2-cors": "^2.0.5",
"mongodb": "^3.0.4",
"mongoose": "^5.0.10"
}
}
下面一个个解释各个文件和文件夹的作用。
app.js
// 导入koa,和koa 1.x不同,在koa2中,我们导入的是一个class,因此用大写的Koa表示:
const Koa = require('koa');
//导入跨域中间件
const cors = require('koa2-cors');
//导入路由映射中间件
//const router = require('koa-router')();
//导入参数解析中间件
const bodyParser = require('koa-bodyparser');
//导入控制器路由
const controller = require('./controller');
//导入mongodb
const mongoose = require('mongoose');
// 创建一个Koa对象表示web app本身:
const app = new Koa();
//使用跨域访问中间件。
app.use(cors());
//使用参数解析中间件,注意,此中间件必须在router前被使用
app.use(bodyParser());
//连接mongodb 数据库 ,地址为mongodb的地址以及集合名称。
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/mongoosedb');
app.use(controller());
// 在端口3000监听:
app.listen(3000);
console.log('app started at port 3000...');
controller.js
控制器文件。用于执行每个路由对应的方法。与routerHandle.js 配套使用。
const routerPath = require('./routerHandle');
let addMapping =(router, mapping)=>{
for (let url in mapping) {
if (url.startsWith('GET')) {
let path = url.substring(4);
router.get(path, mapping[url]);
//console.log(`register URL mapping: GET ${path}`);
} else if (url.startsWith('POST')) {
let path = url.substring(5);
router.post(path, mapping[url]);
//console.log(`register URL mapping: POST ${path}`);
} else {
console.log(`invalid URL: ${url}`);
}
}
};
module.exports = function (dir) {
//这里引入了koa的路由中间件
let router = require('koa-router')();
addMapping(router, routerPath);
return router.routes();
};
router文件夹
里面放着具体的代码逻辑,如router/user.js:
/*router/user.js*/
let User = require('../models/user');
let user = {};
user.userGet = async (ctx, next)=>{
let name = ctx.request.body.name;
let age = ctx.request.body.age;
let userResult = await User.find({name});
try{
if(userResult.length>0){
ctx.body = {op:false,msg:'昵称已存在'};
return
}
let ob = {name,age};
let user = new User(ob);
try {
await user.save();
ctx.body = ob;
}catch (e){
ctx.body = {op:'false',msg:e};
}
}catch (e){
ctx.body = {op:false,msg:e}
}
};
module.exports = user;
schemas 以及 models
在mongoose中,schema和model都是比较重要的概念。schema是用于定义“文档”的结构,model由schema产生。model再被用于创建mongodb的“文档”。
schemas/user.js
/*schemas/user.js*/
let Schema = require('mongoose').Schema;
//定义一个Schema非常简单,指定字段名和类型即可。
let userSchema = new Schema({
name: String,
age: String,
});
module.exports = userSchema;
/*类型支持下面8种。
String 字符串
Number 数字
Date 日期
Buffer 二进制
Boolean 布尔值
Mixed 混合类型
ObjectId 对象ID
Array 数组
*/
models/user.js
/*models/user.js*/
/*可以看到model的内容很简单,所以应该有很多人把model和schema放在一起了。*/
let mongoose = require('mongoose');
let User = require('../schemas/user');
module.exports = mongoose.model('User', User);
model被使用的例子在上面的router/user.js
就这样:
整个结构就解耦起来了。