http.createServer(express()).listen(...)和express().listen(...)有什么区别

一般使用express的时候,会常见两种写法,一种是

var app=require('express')();

app.listen(port,function(){});

另一种是

var app=require('express')();

http.createServer(app).listen(port,function(){});

由于刚刚开始学习node和express,对于这两种写法有什么区别,为什么可以这么写感觉懵懵的。所以自己去看了一下express的源码:


http.createServer(express()).listen(...)和express().listen(...)有什么区别_第1张图片
express模块中的的lib/express.js

可以看到,express()其实是返回了一个名为app的function对象,一开始看到function作为对象调用方法,如app.handle、app.init等这种方式有点不习惯,但是其实function也是Object,具备属性方法以及可以调用方法。

在上面的代码中,使用mixin方法,为app方法添加了EventEmitter.prototype和proto(前面引入的application.js)中的方法。将app上的方法打印出来:


http.createServer(express()).listen(...)和express().listen(...)有什么区别_第2张图片
只截取了部分

可以看到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传入进去。所以其实这两种方式本质是一样的。

    第一次发表博客,希望能帮助到和我一样刚刚开始学习的小伙伴。有错误,欢迎指正!

你可能感兴趣的:(http.createServer(express()).listen(...)和express().listen(...)有什么区别)