一般使用express的时候,会常见两种写法,一种是
var app=require('express')();
app.listen(port,function(){});
另一种是
var app=require('express')();
http.createServer(app).listen(port,function(){});
由于刚刚开始学习node和express,对于这两种写法有什么区别,为什么可以这么写感觉懵懵的。所以自己去看了一下express的源码:
express模块中的的lib/express.js可以看到,express()其实是返回了一个名为app的function对象,一开始看到function作为对象调用方法,如app.handle、app.init等这种方式有点不习惯,但是其实function也是Object,具备属性方法以及可以调用方法。
在上面的代码中,使用mixin方法,为app方法添加了EventEmitter.prototype和proto(前面引入的application.js)中的方法。将app上的方法打印出来:
只截取了部分可以看到typeof app输出为function ,我们常用的use 方法、set方法、path方法等都可以在这个function对象上找到。
所以http.createServer(express())中传入的其实是一个function,和我们常见的http.createServer(function(req,res){})没有本质的区别。
既然express()只是返回了一个function,那么在上面的第一种写法中server是在何时创建的呢,看到listen方法的代码:
application.js中listen方法源码listen方法调用的时候会调用http.createServer(),并且把当前的app传入进去。所以其实这两种方式本质是一样的。
第一次发表博客,希望能帮助到和我一样刚刚开始学习的小伙伴。有错误,欢迎指正!
网友评论