总结Egg常遇到的坑(持续更新...)

5,123 阅读3分钟

前言

  • 【音乐博客】上线啦!
  • 希望小编踩过的坑,可以让各位猿友少走一些弯路
  • 下面总结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({
  beforeSendfunction(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

原文链接

juejin.cn/post/685791…

参考文档

egg官网

Egg的常见问题解决(https://github.com/eggjs/egg/issues)

Egg.js使用typescript时在tsconfig.json中配置别名无效