搭建一个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文件中,有系统默认的几个文件夹,
vue + egg-mongoose搭建后台

  • 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;

现在controllerservice里面都有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,可以百度一下具体使用方法。
vue + egg-mongoose搭建后台

我的接口操作是选出 userName 为Emma的数据,可以用postman模拟请求看一下效果:

vue + egg-mongoose搭建后台

成功啦!!!!

这个是查询的功能,我们还会有增删改,其中增删改都会涉及到数据操作是成功还是失败的信息的返回,我们就以增加数据来举例:
还是第一步:分配路由

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
vue + egg-mongoose搭建后台
请教了一下同行,说是需要在 config 文件夹的 config.default.js 中加上这个:

const config = exports = {
    security: {
      csrf: {
        enable: false
      }
    }
  };

因为之前在model中已经定义了数据表的数据类型,这里就不需要再定义,直接上postman测试:

vue + egg-mongoose搭建后台
表示插入成功!
vue + egg-mongoose搭建后台

如果在真正的项目开发中,需要写的接口特别的多,需要对路由进行分配和归类,我们可以在 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);

};

运行一次,得到之前同样的效果。这样写在遇到大量接口的时候会更加清晰简洁

相关文章: