express 的next方法实现在哪里;触发中间件执行的方法在哪里谁看过哦
发布于 8 年前 作者 slclub 4863 次浏览 来自 问答

express 的next函数在哪里定义, 如果是 app.use(’/’, function(res, req, next){ next();//它如果是上一个,或者下一个中间件的话,调用的时候也没有传参数,那么这个中间件的,req,res,next 的参数会有什么意义 });

20 回复

我暂时有用到next是在两点 1是用node的http proxy做反向代理的时候如果没有匹配到域名就跳到下一个路由 2是匹配到路由后统一输出访问记录什么的

request参数都会跟着被传去下一个路由 所以没有必要传参数

这里 https://github.com/expressjs/express/blob/master/lib/router/index.js#L178 如果你仔细看 next 是在proto.handle内定义的 https://github.com/expressjs/express/blob/master/lib/router/index.js#L135 proto就是app对象的原型,proto.handle,也就是app.handle是请求的入口 res,req被传进app.handle,因为next是在同一个域内定义的,所以可以访问到req和res,而不需要外界反复往next传req,和res,所以中间件的参数列表永远是

function(req, res, next) {

}

@flamingtop @yyss8 非常感谢 route/index.js种 proto 是app的原型 我没从代码种看明白; 下面这段代码的 原型写法我迷糊了;内外感觉乱嵌套是的 42行处代码

var proto = module.exports = function(options) {
  var opts = options || {};

  function router(req, res, next) {
	router.handle(req, res, next);
  }

  // mixin Router class functions
  router.__proto__ = proto;

  router.params = {};
  router._params = [];
  router.caseSensitive = opts.caseSensitive;
  router.mergeParams = opts.mergeParams;
  router.strict = opts.strict;
  router.stack = [];

  return router;
};

@slclub 这段我没仔细看,但我可以猜一下,简化

var proto = function(options) {
  function router(req, res, next) { router.handle(req, res, next); }
  router.__proto__ = proto;  
  return router
};

这几句是对原来的proto对象变形,proto的形态从object变成function,但因为js function也是object,所以可以直接__proto__,并且仍然保持原来的原型链,这样router.handle()就可能了。直接 router.proto 也就是router这个对象的原型(对,router既是函数也是对象)这种写法不多见,但因为__proto__被标准化了,所以也无伤大雅。具体为什么作者一定要这样处理,还得把这个代码放到全局中去看。

@flamingtop 下面定义的都是,proto的方法 然后我这里赋值给router的原型对象上。proto == router.prototype 这写法真叫乱;勉强可以这样理解;

但是说这个proto(router/index的proto)是app"application的module.exports"的原型,放在全局我并没有看出哪里把它放进去 我们写的中间件的方法都是存入,router.stack种的吧;执行的时候从这里面取;

我的功力害是太浅薄了;这么几个文件的框架,搞的我晕头转向;闹不明白;

另外你都有什么debug  方式调试了;

@slclub 你不浅薄,资深的JS dev看这种代码也是需要花很多时间的,文件少不代表简单,作者这样写代码,是因为他对JS的概念有深刻的理解。理解起来困难不是因为代码”乱“,而是对JS理解不深。这个论坛上这么多人,都是偏向于找到个现成的库和框架,快速做一个东西出来,慢了还不干,不花时间去理解语言,碰到这种当然觉得陌生了。

@flamingtop 我刚才看这论坛上没有加好友功能;加个好友吧QQ:308317155 我以前是做php的,一些原因,最近攻克node

基础篇感觉很容易,原型链也没感觉到难;函数式编程也挺喜欢; 就是别人的js代码整体搞起来不容易 我总感觉把服务里加路由,搞业务代码别扭 或许是因为以前的思维。

@slclub 没感觉很难但自己要真去灵活运用还是不容易。 如果你假设别人的代码自己”应该“可以学了JS不费劲看懂,你会很纠结的,因为高手的代码不只是写JS这么简单,还有品位的问题,万年不变业务逻辑,不探索语言核心,没什么搞头。

我不用QQ。

一个个躲进QQ群里,不把知识在web上开放出来,所以一波波地小白用户,和人交流只想解决短平快的问题,永远不深究技术本质,学技术的岔路不知道岔到哪里去了。

@flamingtop 说的太对了。一直搞业务,不去优化,不去探索技术;真是让人松懈; 业务再配合点,夸张的产品;是一种煎熬。

恩,我也是觉得我 除了点测试,几乎等于js呢;看看大家写的方式;设计思路;秉持什么风格。总结下,再写写。

去读读connect的实现吧,代码简单清晰

被这么多人使用才6千多star

@slclub https://github.com/vincentLiuxiang/lu 这个是go语言版的connect,原理差不多

@vincentLiuxiang 还会go语言哈哈;

@slclub 之前给connect提了个优化方案,但是出于向前兼容性的考虑吧,最终作者没采纳。然后我就用go重写了遍,哈哈

@vincentLiuxiang 提了个什么方案 具体的说说

回到顶部