Egg.js里如何获取HTTP参数

这次给大家带来,的注意事项有哪些,下面就是实战案例,一起来看一下。

这次给大家带来Egg.js里如何获取HTTP参数,Egg.js里获取HTTP参数的注意事项有哪些,下面就是实战案例,一起来看一下。

在Egg.js框架中,由于 Controller基本上是业务开发中唯一和HTTP 协议打交道的地方,所以框架通过在 Controller上绑定的 Context实例,提供了许多便捷方法和属性获取用户通过 HTTP请求发送过来的参数。本文就总结一下获取http请求的参数方法:

1.query

在 URL 中 ?后面的部分是一个 Query String,这一部分经常用于 GET 类型的请求中传递参数。例如 GET /search?name=egg&age=26中 name=egg&age=26 就是用户传递过来的参数。我们可以通过 context.query(为一个对象)拿到解析过后的这个参数体

module.exports = app => {  class SearchController extends app.Controller {    * search() {      const queryObj = this.ctx.query;      console.log(queryObj.age);      console.log(queryObj);      //打印结果:{ name: 'egg', age: '26' }    }  }  return SearchController;};

登录后复制

当 Query String 中的 key 重复时,context.query只取 key 第一次出现时的值,后面再出现的都会被忽略。GET /posts?category=egg&category=koa 通过 context.query拿到的值是 { category: ‘egg’ }。

1.1   queries

有时候我们的系统会设计成让用户传递相同的 key,例如 GET /posts?category=egg&id=1&id=2&id=3。针对此类情况,框架提供了 context.queries 对象,这个对象也解析了 Query String,但是它不会丢弃任何一个重复的数据,而是将他们都放到一个数组中:

// GET /posts?category=egg&id=1&id=2&id=3const Controller = require('egg').Controller;module.exports = class PostController extends Controller {  * listPosts() {    console.log(this.ctx.queries);    //result:    // {    //   category: [ 'egg' ],    //   id: [ '1', '2', '3' ],    // }  }};

登录后复制

context.queries上所有的 key 如果有值,也一定会是数组类型。

2. Router params

我们知道在 Router 上也可以申明参数,这些参数都可以通过 context.params获取到。

// app.get('/projects/:projectId/app/:appId', 'app.listApp');// GET /projects/1/app/2const Controller = require('egg').Controller;module.exports = class AppController extends Controller {    * listApp() {    assert.equal(this.ctx.params.projectId, '1');    assert.equal(this.ctx.params.appId, '2');  }};

登录后复制

3. body

虽然我们可以通过 URL 传递参数,但是还是有诸多限制:

浏览器中会对 URL 的长度有所限制,如果需要传递的参数过多就会无法传递。

服务端经常会将访问的完整 URL 记录到日志文件中,有一些敏感数据通过 URL 传递会不安全。

我们知道在 header之后还有一个 body部分,我们通常会在这个部分传递 POST、PUT 和 DELETE 等方法的参数。一般请求中有 body的时候,客户端(浏览器)会同时发送 Content-Type告诉服务端这次请求的 body 是什么格式的。Web 开发中数据传递最常用的两类格式分别是 JSON和 Form。

框架内置了 bodyParser 中间件来对这两类格式的请求 body 解析成 object 挂载到 context.request.body上。HTTP协议中并不建议在通过 GET、HEAD 方法访问时传递 body,所以我们无法在 GET、HEAD 方法中按照此方法获取到内容。

// POST /api/posts HTTP/1.1// Host: localhost:3000// Content-Type: application/json; charset=UTF-8//// {"title": "controller", "content": "what is controller"}const Controller = require('egg').Controller;module.exports = class PostController extends Controller {  * listPosts() {    assert.equal(this.ctx.request.body.title, 'controller');    assert.equal(this.ctx.request.body.content, 'what is controller');  }};

登录后复制

框架对 bodyParser 设置了一些默认参数,配置好之后拥有以下特性:

当请求的 Content-Type 为 application/json,application/json-patch+json,application/vnd.api+json 和 application/csp-report 时,会按照 json格式对请求 body 进行解析,并限制 body 最大长度为 100kb。

当请求的 Content-Type 为 application/x-www-form-urlencoded 时,会按照 form 格式对请求 body 进行解析,并限制 body 最大长度为 100kb。

如果解析成功,body 一定会是一个 Object(可能是一个数组)。

一般来说我们最经常调整的配置项就是变更解析时允许的最大长度,可以在 config/config.default.js中覆盖框架的默认值

module.exports = {  bodyParser: {    jsonLimit: '1mb',    formLimit: '1mb',  },};

登录后复制

如果用户的请求 body 超过了我们配置的解析最大长度,会抛出一个状态码为 413 的异常,如果用户请求的 body 解析失败(错误的 JSON),会抛出一个状态码为 400的异常。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

mysqld_multi部署单机详解

怎样用一条SQL语句查询不同的数据库

JS获取select下拉框中第一顺位元素内的值

以上就是Egg.js里如何获取HTTP参数的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2779443.html

(0)
上一篇 2025年3月8日 15:47:31
下一篇 2025年3月8日 15:47:36

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js实现读取xml文件内容

    这次给大家带来js实现读取xml文件内容,主要以代码的形式体现,下面就是实战案例,一起来看一下。 其中html代码如下所示 W3School.com.cn Internal NoteTo: From: Message: if (window…

    2025年3月8日
    200
  • 关于js可视距离的方法总结

    这次给大家总结关于js可视距离的知识点,下面就是具体内容,一起跟随小编来看一下吧。 JQuery监听页面滚动总结 1、当前滚动的地方的窗口顶端到整个页面顶端的距离:   var winPos = $(window).scrollTop();…

    编程技术 2025年3月8日
    200
  • JavaScript之call和apply

    要想深入的去学习JavaScript语言,有一个很重要的知识点,就是对“call()”和“apply()”的理解,有时候我们在看别人、或者是一些开源框架的源代码的时候,也是大量出现这两个方法,那这两个方法是干嘛的,到底有什么作用?本文主要内…

    2025年3月8日 编程技术
    200
  • Node.js实现注册邮箱激活功能

    在做自己的node项目极客教程时,需要开发一个注册邮箱激活的功能,这个功能非常常见,当我们注册一个账号时,肯定会有这步,下面看下如何实现这个功能。 1. 注册邮箱 先注册一个支持发送验证邮件的邮箱,我这里注册的是网易的163邮箱,所以下面都…

    2025年3月8日
    200
  • JavaScript中五大常见函数详解

    在 javascript 中有一些问题会被拿出来经常讨论,这些问题每个人都有不同的思路,想要理解这些问题,最好的方法就是自己实现一遍,话不多说,开始正题。 数组扁平化 数组扁平化有很多方法,但最终最好的方法就是递归,实现一个指定深度的扁平化…

    编程技术 2025年3月8日
    200
  • JS原始值和引用值的储存方式详解

    本文主要和大家分享js原始值和引用值的储存方式详解,原始值指的是代表原始数据类型的值,也叫基本数据类型,引用值指的是复合数据类型的值。接下来通过示例代码给大家介绍js中原始值和引用值的储存方式,感兴趣的朋友一起看看吧。 在ECMAscrip…

    2025年3月8日
    200
  • 原生iOS与js的交互

    这次给大家带来原生iOS与js的交互,原生iOS与js交互的注意事项有哪些,下面就是实战案例,一起来看一下。 第一个:关于自动登录。由原生app登录web网页,在一定时间内可以不用输入密码登录,而是直接登录到web网页中。而实现这一功能,服…

    2025年3月8日 编程技术
    200
  • JS实现动画定时器方法

    本文主要和大家分享js实现动画定时器方法,广义说:一切通过js改变的视觉呈现都叫动画;例如,按钮,链接等元素交互反馈。,狭义说:通过定时器连续调用js函数进行元素属性改变产生的视觉动画效果。 定时器 定时器是JavaScript动画的核心技…

    2025年3月8日
    200
  • JS的可折叠面板使用详解

    这次给大家带来js的可折叠面板使用详解,使用js可折叠面板的注意事项有哪些,下面就是实战案例,一起来看一下。 举个例子             Part1         I am part 1        Part2        I …

    编程技术 2025年3月8日
    200
  • Node.js如何开发微信墙

    这次给大家带来Node.js如何开发微信墙,Node.js开发微信墙的注意事项有哪些,下面就是实战案例,一起来看一下。 验证服务器有效性 接收用户通过微信订阅号发给服务器的消息 解析收到的XML文本消息格式为JSON 用模板构造应答用户的X…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论