文档章节

eggjs学习笔记

别人说我名字很长
 别人说我名字很长
发布于 2018/08/20 11:15
字数 1081
阅读 1479
收藏 0

快速初始化

生成项目(要求最低的node版本8.x)

npm i egg-init -g
egg-init egg-example --type=simple
cd egg-example
npm i

启动项目

npm run dev

配置

环境配置会覆盖默认配置

config |- config.default.js 默认配置 |- config.prod.js 线上环境测试 |- config.unittest.js 测试环境配置

  • config.local.js 本地开发环境配置

模板渲染

安装egg-view-nunjucks来渲染模板

npm i egg-view-nunjucks --save

开启插件:

// config/plugin.js
exports.nunjucks = {
    enable: true,
    package: 'egg-view-nunjucks'
};
// config/config.default.js
module.exports = appInfo => {

	........

	// 添加view配置
    config.view = {
        defaultViewEngine: 'nunjucks',
        mapping: {
            '.tpl': 'nunjucks',
        },
    };

  	return config;
};

MySQL

安装egg-mysql

npm i --save egg-mysql

开启插件

exports.mysql = {
	enable:true,
	package:'egg-mysql',
}

config/config.local.js 中配置本地开发环境mysql

module.exports = appInfo => {
    const config = exports = {};

	……

    config.mysql = exports.mysql = {
        client: {
            host: '192.168.11.22',
            port: '3306',
            user: 'tongjh',
            password: 'tong123',
            database: 'tongjh_egg',
        },
        app: true,
        agent: false,
    }

  return config;
};

Router

路由默认定义在app/router.js,避免路由规则散落在多个地方,从而出现未知冲突,太多路由映射也可以进行拆分,可直接使用 egg-router-plus

module.exports = app => {
    const { router, controller } = app;

    router.get('/',controller.home.index);
    
    router.get('/user/list', controller.user.list);
    router.post('/user/add', controller.user.add);
    router.get('/user/item/:id', controller.user.item);
    router.put('/user/update', controller.user.update);
    router.delete('/user/delete/:id', controller.user.delete);

    router.get('/curl/get', controller.curl.get);
    router.get('/curl/post', controller.curl.post);
    router.get('/curl/put', controller.curl.put);
    router.get('/curl/delete',controller.curl.delete);
};

Controller

Controller 层主要对用户的请求参数进行处理(校验、转换),然后调用对应的 service 方法处理业务,得到业务结果后封装并返回。所有Controller文件都必须放在app/controller目录下,支持多级目录,项目中的Controller类继承于egg.Controller,会有下面几个属性挂载在this

  • this.ctx: 当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
  • this.app: 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
  • this.service:应用定义的 Service,通过它我们可以访问到抽象出的业务层,等价于 this.ctx.service 。
  • this.config:应用运行时的配置项。
  • this.logger:logger 对象,上面有四个方法(debug,info,warn,error),分别代表打印四个不同级别的日志,使用方法和效果与 context logger 中介绍的一样,但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。

控制器中参数获取

this.ctx.params.id   //path 参数
this.ctx.query.id    //query 参数
this.ctx.queries		//query中重复的key接受
this.ctx.request.body.id //body 参数
this.ctx.headers  //header参数
this.ctx.get(name) //获取请求header中的一个字段的值
this.ctx.cookies.get(name) //获取cookie参数
this.ctx.session.userId //获取session参数

Controller例子

const Controller = require('egg').Controller;

class UserController extends Controller {

    async index() {
        let params = {
            page: this.ctx.query.page || 1,
            pageSize: this.ctx.query.pageSize || 10,
            q: this.ctx.query.q,
            orders: [['id', 'desc']],
            columns: ['id', 'name', 'password','age']
        }
        console.log(params)
        const res = await this.ctx.service.user.list(params)
        await this.ctx.render('user-list.tpl',{list:res});
    }
    
    ......
   
}

module.exports = UserController;

Service

在Service中使用mysql操作CURD

// app/service/user.js
const Service = require('egg').Service;

class UserService extends Service {

    async add(params={}){
        let res = await this.app.mysql.insert('user', params);
        return res;
    }

    async delete(id) {
        const res = await this.app.mysql.delete('user', { id: id });
        return res;
    }

    async update(params = {}) {
        const res = await this.app.mysql.update('user', params);
        return res;
    }

    async item(id=0){
        let res = await this.app.mysql.get('user',{id:id});
        return res;
    }

    async list(params={}){
        let pageSize = parseFloat(params.pageSize||'10');
        let offset = ((params.page || 1) - 1) * params.pageSize;

        let query = {
            limit: pageSize,
            offset:offset
        }

        let where = {};
        if( params.q ){
            where.name = params.q;
        }
        query.where = where;

        if( params.orders ){
            query.orders = params.orders;
        }

        if (params.columns ){
            query.columns = params.columns;
        }
        let res = await this.app.mysql.select('user',query);
        return res;
    }

    async query(sql, params) {
        const res = await this.app.mysql.query(sql,params)
        return res;
    }

}

module.exports = UserService;

HttpClient

框架在Context中提供了ctx.curl(url,options)ctx.httpclient来进行 HTTP 请求

// app/service/curl.js
const Service = require('egg').Service;

class CurlService extends Service{

    async get(){
        const res = await this.ctx.curl('https://httpbin.org/get?foo=bar', {
            dataType: 'json', // 自动解析 JSON response
            timeout: 3000, // 3 秒超时
        });
        return res;
    }

    async post(){
        const res = await this.ctx.curl('https://httpbin.org/post',{
            method: 'POST', // 必须指定 method
            contentType: 'json', // 通过 contentType 告诉 HttpClient 以 JSON 格式发送
            data: { // 传递参数
                hello:'world',
                now: Date.now(),
            },
            dataType: 'json' // 明确告诉 HttpClient 以 JSON 格式处理返回的响应 body
        });
        return res;
    }

    async put(){
        const res = await this.ctx.curl('https://httpbin.org/put',{
            method: 'PUT',
            contentType: 'json',
            data: {
                update: 'foo bar'
            },
            dataType: 'json'
        });
        return res
    }

    async delete(){
        const res = await this.ctx.curl('https://httpbin.org/delete',{
            method: 'DELETE',
            dataType:'json',
        })
        return res;
    }
    
}

module.exports = CurlService;

异常处理

在编写代码时,在所有地方都可以直接用 try catch 来捕获异常

框架通过egg-onerror插件提供了统一的错误处理机制,并提供了自定义统一异常处理机制

© 著作权归作者所有

别人说我名字很长
粉丝 58
博文 265
码字总数 113918
作品 0
济南
程序员
私信 提问
Node 8 LTS + Egg 2.x 计划

> eggjs-feed-05, 系列期刊,用于汇总近期值得关注的 egg 相关动态,将不定期发布。 ## Node 8 终于 LTS 了,启动 Egg 2.x 。 基于新的 V8,因此性能得到大幅提升,我们内部好几个项目升级后...

天猪(刘勇)
2017/11/02
0
0
Vscode debug eggjs

一番搜集之后,记录一下。参考,eggjs文档,vscode插件。 Vscode 安装扩展 eggjs 添加 debugger,选择 egg 配置,如果没有,删掉 重试 运行 debugger...

Geeyu
2018/02/28
238
0
docker compose相关问题

问题1 depends_on 和 links有什么不同 解决 dependson,links都可以指定依赖。 dependson指定了依赖,将会优先于服务创建并启动依赖,一般用在mysql、redis等。 参考文章 http://blog.51cto....

治电小白菜
2018/05/10
0
0
eggjs跨域访问—CORS插件

当做前后端分离时,常常遇到跨域访问问题 这里我用eggjs做后端,前端通过ajax获取数据 eggjs开启跨域访问,需要用到egg-cors插件 egg-cors安装: 开启egg-cors插件: 配置文件:...

月夜中徘徊
01/14
284
0
如何正确的提出一个 Issue ?

如何正确的提出一个 Issue ? Egg Version: Plugin Name: Plugin Version: Platform: Mini Showcase Repository: 描述你希望解决的问题的现状 附上相关的 issue 地址 思路 描述大概的解决思路...

天猪
2018/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js如何控制table中的某一行动态置顶

两行代码搞定: $('#'+item.roadCode).fadeOut().fadeIn();//获取到需要置顶的行 $(".table").prepend($('#'+item.roadCode)); 其中,fadeOut()方法 作用 --- 从可见到隐藏 如下: prepend(......

码妞
56分钟前
4
0
四种解决Nginx出现403 forbidden 报错的方法

我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log。打开日志发现报错Permission denied,详细报错如下: 1....

dragon_tech
今天
3
0
获取RestResultResponse返回的值

Springboot项目,需要调其他服务的接口,返回值类型是RestResultResponse 打断点的结果集是这个 打印出来的getData(): [{id=3336b624-8474-4dd9-bd5b-c7358687c877, paraNo=104, para=Postpo...

栾小糖
今天
4
0
【小学】 生成10以内的加减法

#!/usr/bin/env python# coding: utf-8from random import randrange# 题目的最大数值R_MAX = 10# 生成的题目的数量R_PAGE = 70# 生成减法列表def get_sub_list():...

Tensor丨思悟
今天
11
0
JavaScript设计模式——适配器模式

  适配器模式是设计模式行为型模式中的一种模式;   定义:   适配器用来解决两个已有接口之间不匹配的问题,它并不需要考虑接口是如何实现,也不用考虑将来该如何修改;适配器不需要修...

有梦想的咸鱼前端
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部