搭建一個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);
};
運行一次,得到之前同樣的效果。這樣寫在遇到大量接口的時候會更加清晰簡潔