今天做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