koa中的headers和heaer以及egg中的使用
发布于 6 年前 作者 zheng199512 7064 次浏览 来自 分享

今天做egg的调试的时候偶然发现了header和headers,想了想这是什么东西? egg是在koa上进行封装的,读了大神写的koa的源码剖析:https://github.com/berwin/Blog/issues/8

var delegate = require('delegates');
var proto = module.exports = {}; // 一些自身方法,被我删了

/**
 * Response delegation.
 */

delegate(proto, 'response')
  .method('attachment')
  .method('redirect')
  .method('remove')
  .method('vary')
  .method('set')
  .method('append')
  .access('status')
  .access('message')
  .access('body')
  .access('length')
  .access('type')
  .access('lastModified')
  .access('etag')
  .getter('headerSent')
  .getter('writable');

/**
 * Request delegation.
 */

delegate(proto, 'request')
  .method('acceptsLanguages')
  .method('acceptsEncodings')
  .method('acceptsCharsets')
  .method('accepts')
  .method('get')
  .method('is')
  .access('querystring')
  .access('idempotent')
  .access('socket')
  .access('search')
  .access('method')
  .access('query')
  .access('path')
  .access('url')
  .getter('origin')
  .getter('href')
  .getter('subdomains')
  .getter('protocol')
  .getter('host')
  .getter('hostname')
  .getter('header')
  .getter('headers')
  .getter('secure')
  .getter('stale')
  .getter('fresh')
  .getter('ips')
  .getter('ip');

Context中有两部分,一部分是自身属性,主要是应用于框架内部使用,一部分是Request和Response委托的操作方法,主要为提供给用户更方便从Request获取想要的参数和更方便的设置Response内容。 由此找到koa的源码:

 /**
   * Return request header.
   *
   * [@return](/user/return) {Object}
   * [@api](/user/api) public
   */

  get header() {
    return this.req.headers;
  },

  /**
   * Set request header.
   *
   * [@api](/user/api) public
   */

  set header(val) {
    this.req.headers = val;
  },

  /**
   * Return request header, alias as request.header
   *
   * [@return](/user/return) {Object}
   * [@api](/user/api) public
   */

  get headers() {
    return this.req.headers;
  },

  /**
   * Set request header, alias as request.header
   *
   * [@api](/user/api) public
   */

  set headers(val) {
    this.req.headers = val;
  },

只是alias而已, 那么在egg中要怎么进行使用呢? egg的官方文档也给出了详细的介绍:https://eggjs.org/zh-cn/basics/controller.html#header 除了从 URL 和请求 body 上获取参数之外,还有许多参数是通过请求 header 传递的。框架提供了一些辅助属性和方法来获取。

ctx.headers,ctx.header,ctx.request.headers,ctx.request.header:这几个方法是等价的,都是获取整个 header 对象。 ctx.get(name),ctx.request.get(name):获取请求 header 中的一个字段的值,如果这个字段不存在,会返回空字符串。 我们建议用 ctx.get(name) 而不是 ctx.headers[‘name’],因为前者会自动处理大小写。 由于 header 比较特殊,有一些是 HTTP 协议规定了具体含义的(例如 Content-Type,Accept),有些是反向代理设置的,已经约定俗成(X-Forwarded-For),框架也会对他们增加一些便捷的 getter,详细的 getter 可以查看 API 文档。

特别是如果我们通过 config.proxy = true 设置了应用部署在反向代理(Nginx)之后,有一些 Getter 的内部处理会发生改变。

此处egg的文档还给出了一点需要注意的: 就是进行代理的时候会有一些改变。 详细的信息可以参照上面的链接,大家可以读一下~

附上一条招聘信息: 地点:郑州 公司:中移在线服务有限公司 职位:前端 or node node方面主要推进微服务落地,技术:egg,koa,express,react 投递邮箱:zhenghongfei@cmos.chinamobile.com

4 回复

@Ander456 嘻嘻,有回复了,开心~复制粘贴,一把梭~

顶下,郑~

@zlmica thank you so much

回到顶部