前言
- 【音乐博客】上线啦!
- 希望小编踩过的坑,可以让各位猿友少走一些弯路
- 下面总结Egg开发中可能会遇到的问题
POST请求与CSRF
- 在egg中,假如接口编写完毕,使用Postman发生POST请求测试接口,结果发现控制器报错
2020-08-06 23:51:23,286 WARN 79968 [-/127.0.0.1/-/15ms POST /users] invalid csrf token. See https://eggjs.org/zh-cn/core/security.html#安全威胁csrf的防范 - 原因是因为Egg帮我们默认配置了CSRF的防范
- CSRF中文名叫跨站请求伪造,是一种对网站的恶意利用。CSRF 攻击会对网站发起恶意伪造的请求,严重影响网站的安全。因此框架内置了 CSRF 防范方案。
「解决方案」
一般我们发送AJAX请求,在 CSRF 默认配置下,csrfToken 会被设置在 Cookie 中,在 AJAX 请求的时候,可以从 Cookie 中取到 csrfToken,放置到 query、body 或者 header 中发送给服务端。如:
var csrftoken = Cookies.get('csrfToken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader('x-csrf-token', csrftoken);
}
},
});
关于Egg更多的安全问题,可移步到Egg-安全
POST参数接收不到
- 在Egg中,若请求为POST请求,使用
ctx.request.body即可接收到参数 - 但若Body为form-data时,用
ctx.request.body是接收不到参数的,那是因为Egg封装里面只接收x-www-form-urlencoded这种类型 - 我们只要将Body的类型改为
x-www-form-urlencoded即可用ctx.request.body接收参数
❝x-www-form-urlencoded 多个字段值用 & 拼接,用于传文本。(「窗体数据被编码为名称/值对」)
❞
form-data 多个字段值用上面出现的 ----------------------------961448793903793318528971 拼接,会在 content-type 中说明这个随机值,form-data 主要用于传输文件用,会告诉服务器传输文件的 文件名、mimetype 等。(「窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分」)
EggJs使用typescript时在tsconfig.json中配置别名无效
- Egg.js使用TypeScript版本时,在
tsconfig.json中配置paths,如下所示
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["app/*"]
}
}
}
- 然后在页面使用@别名引入一个文件时会报
can't find module @....错误。
「分析问题」
- 其实,Egg运行时会将ts文件转换为js文件,但是并不会去转换 import 的模块路径,如果用ts中配置的别名,转换为js后自然就找不到模块了。
「解决问题」
- tsconfig-paths
- 使用 paths 的时候只用来 import 一些声明而非具体值,再要么就可以使用 tsconfig-paths 来 hook 掉 node 中的模块路径解析逻辑,从而支持 tsconfig.json 中的 paths。
- 使用 tsconfig-paths 可以直接在
config/plugin.ts中引入,因为 plugin.ts 不管在 App 中还是在 Agent 中都是第一个加载的,因此在这个代码中引入 tsconfig-paths 即可。
// config/plugin.ts
import 'tsconfig-paths/register';
...
- 当然也可以不使用paths