这个系列并不是入门系列。其实我自己还没入门。。入门的话,推荐大家
不过虽然是大神写的教程,也要带着怀疑的态度去看~~
这个系列,主要讲一些我初学nodejs时,比较困惑的地方。因为比较困惑,所以偶尔会研究的深一点。所以,虽叫初学,但可能并不简单。
现在学node,不来点Express,都不好意思给人打招呼。但是,我刚接触的时候,觉得好多API,感觉乱糟糟的,没办法,大脑容量不够。不过有一样东西叫地铁,在上面可以让人想清楚很多事情(-_-!
先来一段最简单的node版hello world
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
上面这段代码来自nodejs的官网,非常简单,就是来一个请求,就用传给createServer的匿名函数来处理请求。
下面来看看使用Express的代码
var app = express(); //...中间忽略 http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
对比可以看出,执行express()后,会返回一个函数,赋值给app,app的签名应该为
function(req,res){//...}
然后请求都会被app这个函数处理(因为这个app是执行express后的结果,下面将不加区分的使用app和express两个词)。
可以认为,在express内部,有一个函数的数组,暂时叫这个数组tasks,每来一个请求express内部会依次执行这个数组中的函数(这里说依次并不严谨,每个函数必须满足一定条件才行,这个后面说),应该可以想到,在这个函数数组里,每个函数的签名应该像下面那样
function(req,res){//...}
但是,实际上是
function(req,res,next){//...}
这个next,是指下一个函数。后面我们会写一些试验来体验一下这个next,先总结一下:
对于一个典型的使用express的app.js(这个满大街都是代码,就不贴了),做了以下几件事
注册进express中的函数,需要满足(请见下面更正)
1.长成下面这个样子
function(req,res,next){
//...我们自己的逻辑 next();
}
2.app.use(customerFunc) 要写在下面两句的前面
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
关于第2点,是因为路由后或请求静态资源后,一次请求响应的生命周期实质上已经结束,加在这后面进行请求处理,没有任何意义。
关于第1点,写点代码就好了,
app.use(function(req,res,next){
console.log("111");
next();
});
如果不写next(),那么后面注册的函数就不会执行,运行试一下就知道了。
再来一个:
app.use(function(req,res,next){
console.log('111');
next();
console.log('222');
});
app.use(function(req,res,next){
console.log("333");
next();
});
那么控制台的输出的顺序是:111 333 222