GET

路由配置
router

  1. router.get('/user/detail', controller.user.detail);

静态传参

user.js

  1. async detail() {
  2. const { ctx } = this;
  3. ctx.body = ctx.query.id;
  4. }

效果就是 url 中传入的id参数会显示在页面上。

动态传参

router

  1. router.get('/user/detail2/:id', controller.user.detail2);

注意这个正则

  1. async detail2() {
  2. const { ctx } = this;
  3. ctx.body = ctx.params.id;
  4. }

效果同上

测试编写

test

  1. it('user detail', async () => {
  2. await app
  3. .httpRequest()
  4. .get('/user/detail?id=123')
  5. .expect(200)
  6. .expect('123');
  7. });
  8. it('user detail2', async () => {
  9. await app
  10. .httpRequest()
  11. .get('/user/detail2/100')
  12. .expect(200)
  13. .expect('100');
  14. });

POST

路由配置
router

  1. router.post('/user/add', controller.user.add);

工具APIPOST

APIPOST

Egg 框架的安全防范

Web 安全概念

为了方便发送请求进行测试:
config

  1. config.security = {
  2. csrf: {
  3. enable: false,
  4. },
  5. };

传参

  1. async add() {
  2. const { ctx } = this;
  3. ctx.body = { status: 200, data: ctx.request.body };
  4. }

image.png

POST 传参校验

利用 Egg的 一个插件egg-validate
官网说明
安装 yarn add egg-validate

plugin.js

  1. 'use strict';
  2. /** @type Egg.EggPlugin */
  3. exports.validate = {
  4. enable: true,
  5. package: 'egg-validate',
  6. };

user.js

  1. async add() {
  2. const { ctx } = this;
  3. //** 制定参数规则
  4. const rule = {
  5. name: { type: 'string' },
  6. age: { type: 'number' },
  7. };
  8. ctx.validate(rule);
  9. //**
  10. ctx.body = { status: 200, data: ctx.request.body };
  11. }

如此一来,如果参数类型不符就会在终端报错,并且返回 422 状态码
image.png

测试编写

user.test.js

  1. it('user add post', async () => {
  2. await app
  3. .httpRequest()
  4. .post('/user/add')
  5. .send({
  6. name: 'zhou',
  7. age: 20,
  8. })
  9. .expect(200)
  10. .expect({
  11. status: 200,
  12. data: {
  13. name: 'zhou',
  14. age: 20,
  15. },
  16. });
  17. });

PUT

路由配置
router

  1. router.put('/user/edit', controller.user.edit);

user

  1. async edit() {
  2. const { ctx } = this;
  3. ctx.body = ctx.request.body;
  4. }

DELETE

路由配置
router

  1. router.del('/user/del', controller.user.del);

user

  1. async del() {
  2. const { ctx } = this;
  3. ctx.body = ctx.request.body.id;
  4. }