搭建一个egg项目:
代码地址:demo
$ npm i egg-init -g
$ egg-init egg-example --type=simple
$ cd egg-example
$ npm i
启动项目
$ npm run dev
$ open localhost:7001
链接到本地的MongoDB:
安装mongoose并引入到项目中
npm install egg-mongoose -S
- 在config文件中找到 config.default.js 文件
// 引入egg-mongoose
const mongoose = require('mongoose');
module.exports = appInfo => {
const config = exports = {};
config.keys = appInfo.name + '_1539588102822_7832'; //此处的字符是自己设定的cookie加密码
// 添加 view 配置,nunjucks是一个用来在服务器端渲染HTML的插件,用npm 安装即可
exports.view = {
defaultViewEngine: 'nunjucks',
mapping: {
'.tpl': 'nunjucks',
},
};
exports.mongoose = {
url: 'mongodb://127.0.0.1:27017/mongoTest',
//链接到本地的MongoDB,mongoTest是我本地数据库的名字,根据自己数据库名字进行填写即可
options: {},
};
// add your config here
config.middleware = [];
return config;
};
写接口
在egg 项目的app文件中,有系统默认的几个文件夹,
- controller : 是用来分发路由接口请求的文件夹
- middleware : 是用来存放中间件的文件夹
- model : 是用来定义数据类型的文件夹
- service : 是用来操作数据库的文件存放的地方
- view : 是用来存放一些需要服务器渲染的页面的
.html或.tpl文件的地方 - router.js :是用来分配接口路由的文件
介绍了以上的文件夹的作用,就可以开始写自己的后台项目了,每个模块对应的命名有一定的要求,比如我现在要创建一个关于用户管理的接口,我给文件命名为user,那么我就需要在controller,service,model中创建一个user.js,入门级的使用方式可以参照 egg快速入门
首先分配路由:(在router.js文件中)
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.index);
router.get('/get', controller.user.list);
// 此处我定义了一个路由地址,对应的是controller下面的user文件里面的list方法
};
那么我就需要在controller文件夹下面创建一个user.js文件,并在里面创立一个list方法,因为controller对应的是不同路由的操作的文件夹,所以这里当我们接收到对应的路由请求之后,对数据路进行对应的操作
// app/controller/user.js
const Controller = require('egg').Controller;
class UserController extends Controller {
// 这里的 list 就是上面 controller.user.list 里面的 list
async list() {
const ctx = this.ctx;
var aa = await ctx.service.user.list()
// 此处我们将操作数据库,所以调用的是 service 文件夹里面的user.js 文件里面的 list方法
// 调用玩这个方法后,会返回一个数据,我们用 aa 来接收
ctx.body = aa
// 将接收到返回的数据渲染出来
}
}
module.exports = UserController;
在上面的操作中我们需要调用service文件夹里面的user.js里面的list方法,那么我们就要在service文件夹里面创建一个user.js文件
// app/service/user.js
const Service = require('egg').Service;
class UserService extends Service {
async list() {
const ctx = this.ctx;
return ctx.model.User.find({"userName":"Emma"})
// ctx.model.User.find({"title":"111"}) 表示在数据库中查找title 为111的对应数据
}
}
module.exports = UserService;
现在controller,service里面都有user.js文件了,还有model 里面需要
// app/model/user.js
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const UserSchema = new Schema({
userName: { type: String },
age: { type: Number},
gender:{type : String },
hobby:{type : Array }
});
// 以上定义了表数据的类型
return mongoose.model('User', UserSchema,'userInfo');
// model(参数1,参数2,参数3)参数3是你数据表中需要操作的表的名字,
// 比如我现在要操作的是名字叫mongoTest里面的叫userInfo的表
}
可以利用postman进行请求的模拟:
我的数据库表单里面有三条信息:(这是mongodb的一个可视化工具,叫adminMongo,可以百度一下具体使用方法。
我的接口操作是选出 userName 为Emma的数据,可以用postman模拟请求看一下效果:
成功啦!!!!
这个是查询的功能,我们还会有增删改,其中增删改都会涉及到数据操作是成功还是失败的信息的返回,我们就以增加数据来举例:
还是第一步:分配路由
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.index);
router.get('/get', controller.user.list);
router.get('/add', controller.user.add);
};
然后是去controller的user.js里面添加add方法:
// app/controller/user.js
const Controller = require('egg').Controller;
class UserController extends Controller {
// 这里的 list 就是上面 controller.user.list 里面的 list
async list() {
const ctx = this.ctx;
var aa = await ctx.service.user.list()
// 此处我们将操作数据库,所以调用的是 service 文件夹里面的user.js 文件里面的 list方法
// 调用玩这个方法后,会返回一个数据,我们用 aa 来接收
ctx.body = aa
// 将接收到返回的数据渲染出来
}
// 添加用户
async add() {
const ctx = this.ctx;
ctx.body = await ctx.service.user.add();
}
}
module.exports = UserController;
然后是service文件夹:
// app/service/user.js
const Service = require('egg').Service;
class UserService extends Service {
async list() {
const ctx = this.ctx;
return ctx.model.User.find({"userName":"Emma"})
// ctx.model.User.find({"title":"111"}) 表示在数据库中查找title 为111的对应数据
}
// 添加用户
async add() {
const ctx = this.ctx
return ctx.model.User.create({
userName:"Tom",
age:19,
gender:"nan",
hobby:['eating','joking']
}).then(res =>{
return {success:true,mag:"",code:0}
}).catch(err =>{
return {success:false,err:err}
})
}
}
module.exports = UserService;
发送请求,然后报错,gg
请教了一下同行,说是需要在 config 文件夹的 config.default.js 中加上这个:
const config = exports = {
security: {
csrf: {
enable: false
}
}
};
因为之前在model中已经定义了数据表的数据类型,这里就不需要再定义,直接上postman测试:
表示插入成功!
如果在真正的项目开发中,需要写的接口特别的多,需要对路由进行分配和归类,我们可以在 app 文件夹下创建一个子文件,叫做 route
此时更改一下router.js文件内容:
'use strict';
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const { router, controller } = app;
require('./route/user')(app)
// 我将之前所有跟用户信息相关的路由操作都放在一个类别中
router.get('/', controller.home.index);
};
在route文件夹中创建一个user.js的文件
// app/route/user.js
module.exports = app => {
//
app.router.get('/get', app.controller.user.list);
// 添加用户信息
app.router.post('/add', app.controller.user.add);
};
运行一次,得到之前同样的效果。这样写在遇到大量接口的时候会更加清晰简洁