基本使用
router 路由
app/router.js 文件
- 整个项目能访问的接口都得开路由
- 默认路由"/"
/api/:id
占位符的位置必须有值- 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 用于解析用户的输入,处理后返回相应的结果
控制器中的每个文件都必须要保存这个格式约定
获取参数方法如下代码中
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' ] }
想使用post请求, 需要处理csrf的防范
如何设置status
ctx.body 的值是接口返回的参数
- 参数是字符串
- 可以是json字符串
- 也可以是页面文件字符串
- 还可以是流…
// 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 。
解决方法建议直接关闭
配置方法
以下两个用一个就结果是一样的
// 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 | 回显服务器收到的请求,主要用于测试或诊断。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |