表示对所谓 Web 框架只停留在写一下 app.get()
那种水平…
帖子写一半想起去看源码… 怎么偏偏找不到 app.get =
的具体代码
https://github.com/visionmedia/express/blob/master/lib/application.js
首先在前边看到获取变量的解释:
Get setting name value
app.get('title');
而后面又是我更熟悉的处理 GET
请求的用法…
app.get('/', function(req, res){
res.send('hello world');
});
这是为什么?
还有 app.params() app.use() app.engine()
我还好理解,
可前边的 app.set()
设置那么多变量那是做什么用的?
/**
* Delegate `.VERB(...)` calls to `.route(VERB, ...)`.
*/
methods.forEach(function(method){
app[method] = function(path){
if ('get' == method && 1 == arguments.length) return this.set(path);
var args = [method].concat([].slice.call(arguments));
if (!this._usedRouter) this.use(this.router);
return this._router.route.apply(this._router, args);
}
});
若调用app.get()
时只有一个参数,则认为是取设置值,否则认为是注册路由
@jiyinyiyong
app.get()这个功能是由一个叫router
的中间件来处理的
默认创建的代码中有这一行,就是使用这个路由中间件:
app.use(app.router);
app.router的定义在这里:https://github.com/visionmedia/express/blob/master/lib/application.js#L70
// router
this._router = new Router(this);
this.routes = this._router.map;
this.__defineGetter__('router', function(){
this._usedRouter = true;
this._router.caseSensitive = this.enabled('case sensitive routing');
this._router.strict = this.enabled('strict routing');
return this._router.middleware;
});
router.middleware的代码:https://github.com/visionmedia/express/blob/master/lib/router/index.js#L32
this.middleware = function router(req, res, next){
self._dispatch(req, res, next);
};
这个_dispatch
方法就是查找是否有注册匹配的路由,如果有则调用相应的函数,否则直接调用next()
进入下一个中间件。
@jiyinyiyong app.get('/ooxx', function () {});
不是注册中间件,而是对中间件app.router
进行配置(包括app.post()
,app.all()
等),虽然其工作机制跟middleware差不多,但不要混淆。