vue + egg-mongoose搭建後臺

搭建一個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;

現在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,可以百度一下具體使用方法。
在這裏插入圖片描述

我的接口操作是選出 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);

};

運行一次,得到之前同樣的效果。這樣寫在遇到大量接口的時候會更加清晰簡潔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章