01-egg基本请求与响应

基本使用

router 路由

app/router.js 文件

  1. 整个项目能访问的接口都得开路由
  2. 默认路由"/"
  3. /api/:id占位符的位置必须有值
  4. jsonp暴露接口给别人的
// app/router.js

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller, jsonp } = app;
  router.get('/', controller.home.index);
  router.post('/', controller.home.index);
    
  // 格式
  // router.请求类型('路由'[,'过滤器1',过滤器2...], (控制器.文件名.文件中类中的方法名))
  router.get('/api', controller.home.api);
  router.get('/api/:id', controller.home.api);
    
  // jsonp  一种不会跨越的请求 注意有个jsonp的中间件
  router.get('/dome/index.json', jsonp, controller.home.json);
};

controller 控制器

app/controller 用于解析用户的输入,处理后返回相应的结果

  1. 控制器中的每个文件都必须要保存这个格式约定

  2. 获取参数方法如下代码中

  3. queries 可以接收get参数数组形式的

    • url: http://127.0.0.1:7001/123?dwp=name&dwp=name2&dwp=name3

    • 运行结果: console.log(ctx.queries); //(form表单的复选框){ dwp: [ 'name', 'name2', 'name3' ] }

  4. 想使用post请求, 需要处理csrf的防范

  5. 如何设置status

  6. ctx.body 的值是接口返回的参数

    1. 参数是字符串
    2. 可以是json字符串
    3. 也可以是页面文件字符串
    4. 还可以是流…
// app/controller/home.js
//  require('egg') 
const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    const { ctx } = this;
   // ## 特殊操作
    // 01- 重定向
    // ctx.unsafeRedirect('http://www.baidu.com') // 没有限制, 随便跳
    // ctx.redirect("http://www.baidu.com");  // 如果不在配置的白名单域名内,则禁止跳转。
      
   // ## 获取参数 GET
    // 01- 获取参数 获取占位符参数
     console.log(ctx.params);
    // 02- 获取参数 获取get传参
     console.log(ctx.query);
    // 03- 获取参数 获取get传参  针对格式是 
     console.log(ctx.queries);
    
   // ## 获取参数 POST
    //01- 获取 POST请求 请求头为 content-type →application/json; charset=utf-8
     console.dir(ctx.request.body);
      
      
      // { 业务逻辑代码 }
      
    // ## 异常处理
     // 01- 报错日志 控制台打印
      ctx.logger.warn('报错信息-会在控制台显示');
      
    // ## 返回响应
     // 01- 设置status
     ctx.status = 201; 
     // 02- 设置返回参数
     ctx.body = { id: ctx.params.id, content: "hi egg"};
  }
  
  async api() {
      const { ctx } = this;
      ctx.body = {data: "随便写一些内容 为了好看"}
  }
   // 也可以返回页面
   async page() {
    this.ctx.body = '<html><h1>Hello</h1></html>';
  }
    
  async json() {
  	this.ctx.body = '';
  }
}

// 注意一定要导出
module.exports = HomeController;

处理csrf的防范, 为了进行POST请求

正常项目, 你是用post请求方式, 会报错:‘secret is missing’。错误信息来自 koa-csrf/index.js#L69 。

具体详情可见: https://eggjs.org/zh-cn/core/security.html#%E5%AE%89%E5%85%A8%E5%A8%81%E8%83%81-csrf-%E7%9A%84%E9%98%B2%E8%8C%83

解决方法建议直接关闭

配置方法

以下两个用一个就结果是一样的

// config/config.default.js
// 01- 这种配置
module.exports = (appInfo) => {
  const config = (exports = {});
    
    // 安全设置 csrf 安装配置
  config.security = {
    csrf: false 
  }
}

// 02- 这种配置
module.exports = {
  security: {
    csrf: false
  }
}

// 配置完后, post请求就能正常使用了

安装 egg-cors

config/plugin.js 下添加
    exports.cors = {
        enable: true,
        package: 'egg-cors'
    }
    
    config.default.js 下添加
    
    config.cors = {
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
        credentials: true,
        origin: '*',  /允许的请求来源(*表示允许所有的IP的请求 )
    }
    
    config.security = {
        csrf:{
            enable: false
        }
    }


参数的效验

在获取到用户请求的参数后,不可避免的要对参数进行一些校验。

借助 Validate 插件提供便捷的参数校验机制,帮助我们完成各种复杂的参数校验。

完全和parameter的校验规则一样。建议直接看readme文档,虽然是英文的,但是配着翻译看个7788是差不多的。

下载

npm i egg-validate --save

配置

// config/config.default.js
config.validate = {   // 配置参数校验器,基于parameter
    convert: true,    // 对参数可以使用convertType规则进行类型转换  如果不配置 比如: 就会传过来的数值是string
    // validateRoot: false,   // 限制被验证值必须是一个对象。
};
// config/plugin.js 
// 使用插件要去plugin.js去添加
exports.validate = {
  enable: true,  // 是否启用
  package: 'egg-validate', // 插件名称
};

通过 ctx.validate(rule, [body]) 直接对参数进行校验:

ctx.validate({ title: 'string' });这里面的rule就是{ title: ‘string’ },它会这么检验,首先判断这个title有没有在ctx.request.body里面,没有就跑出参数不存在、然后是title不能为空、然后得是string。有一个不符合都会抛出错误。

class PostController extends Controller {
  async create() {
    // 校验参数
    // 如果不传第二个参数会自动校验 `ctx.request.body`
    this.ctx.validate({
      title: { type: 'string' },
      content: { type: 'string' },
    });
  }
}

当校验异常时,会直接抛出一个异常,异常的状态码为 422,errors 字段包含了详细的验证不通过信息。如果想要自己处理检查的异常,可以通过 try catch 来自行捕获。

class PostController extends Controller {
  async create() {
    const ctx = this.ctx;
    try {
      ctx.validate(createRule);
    } catch (err) {
      ctx.logger.warn(err.errors);
      ctx.body = { success: false };
      return;
    }
  }
};

校验规则有这些,文档很详细了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fns73v8o-1648472212520)(media/01-egg内置对象/image-20210526163205684.png)]

http请求的方式

数据交互是程序必不可少的部分,前端将请求通过ajax发送到后端指定路由后,后端需要将请求进行处理

HTTP请求的方式有8种,分别是

  • HTTP1.0定义的三种:GET、POST、HEAD
  • HTTP1.1定义的五种:OPTIONS、PUT、DELETE、TRACE、CONNECT
方法描述
GET请求指定的页面信息,并返回实体主题
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
OPTIONS允许客户端查看服务器的性能。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的页面。
TRACE回显服务器收到的请求,主要用于测试或诊断。
有具体的内容,用于获取报头
OPTIONS允许客户端查看服务器的性能。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的页面。
TRACE回显服务器收到的请求,主要用于测试或诊断。
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厚渡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值