当前位置: 首页 > 文档资料 > 阅读 express 源码 >

2.7 内置中间件

优质
小牛编辑
127浏览
2023-12-01

2.7.1 init

该中间件是初始化中间件,在 header 头里面增加一个 X-Powered-By 字段,然后在 req,res 上面互相保存一下,让 req 的原型链设置为 app.request,以及初始化 locals 变量 。

exports.init = function(app){
  return function expressInit(req, res, next){
    if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express');
    req.res = res;
    res.req = req;
    req.next = next;

    setPrototypeOf(req, app.request)
    setPrototypeOf(res, app.response)

    res.locals = res.locals || Object.create(null);

    next();
  };
};

2.7.2 query

query 依赖 package 包 qs、parseurl。qs 是一个解析 querystring 的包,querystring 就是 URL 后面,?username=yugo&gender=mail&year=22 这样类似的一段字符串,它会解析成一个键值对的对象保存到 req.query 上面去。

module.exports = function query(options) {
  var opts = Object.create(options || null);
  var queryparse = qs.parse;

  if (typeof options === 'function') {
    queryparse = options;
    opts = undefined;
  }

  if (opts !== undefined && opts.allowPrototypes === undefined) {
    // back-compat for qs module
    opts.allowPrototypes = true;
  }

  return function query(req, res, next){
    if (!req.query) {
      var val = parseUrl(req).query;  // parseUrl 的功能与 Node 核心模块的 url.parse 相同,不过多了一个缓存功能。
      req.query = queryparse(val, opts);
    }

    next();
  };
};