express里http.createServer和app.listen有什么区别?
发布于 10个月前 作者 firhome 1470 次浏览

var express = require(‘express’); var app = express(); app.listen(3000);

和 var express = require(‘express’); var http = require(‘http’); var app = express();

http.createServer(app).listen(80);

利用http 模块创建的server有什么区别吗?

13 回复
app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

功力不够,我的理解是:http.createServer是原生方法,接收一个requestListener,而express是封闭了许多方法和处理了req,res等的集合。把它传入则是可以处理这些东西了。app.listen是返回一个promise,参照楼上原生的应该也是一样的意思。

上面那种方法是最基本的写法。而下面那种用法,是反而又使用了http模块(http模块已经被express使用过了),通过createServer函数,为app对象挂载上了很多http模块中的属性和方法,例如多了个listen方法。。。。

感觉我没说明白的样子— —。。。

app.listen(3000); 已经废弃了… orz…

第一种只能使用app使用express的属性和方法; 第二种不但可以使用express的属性和方法,而且还可以使用Http的属性和方法。

个人了解到的是这样的: 1.http是原生的,专做基于http服务的工作,但是在开发中,我们需要不停地通过request.url和request.method来判断你在登录还是注册的操作。 2.connect为了方便开发人员,它封装了http,提供了如日志,文件托管和编写自己的中间件等功能。虽然在获取具体的操作是还是通过request.url和request.method的形式处理,但是它将特定功能的代码,拆分成单个的代码块。 3. express为了更加方便开发人员,它封装了connect,提供了更多的功能,所以你用express创建出来的server对象,可以认为是express的httpServer对象,也可以说是connect的httpServer对象,当然也可以是原生的http对象,越往上功能越完善。 不知道说的对不对,权且看一看,看不懂再聊吧,呵呵

两种有什么区别吗?

要明白这些不看源码怎么行?

请问这种写法废弃了吗 - -。为什么我express app创建自动创建一个应用程序骨架的时候= =(4.x),一开始自动生成的代码还是app.listen(port)的方法?

没区别,请看2楼贴出来的app.listen的源代码。

app就是一个:

function (req, res) {}

同时具备一个属性:

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

以上。

楼上这段代码正解。

回到顶部