express里http.createServer和app.listen有什么区别?
发布于 10 年前 作者 firhome 31358 次浏览 最后一次编辑是 8 年前

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有什么区别吗?

14 回复
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);
}; 

以上。

楼上这段代码正解。

搜了一下,并看了koa和express这部分的代码: koa: /** * Shorthand for: * * http.createServer(app.callback()).listen(…) * * @param {Mixed} … * @return {Server} * @api public */

listen() {
  debug('listen');
  const server = http.createServer(this.callback());
  return server.listen.apply(server, arguments);
}

express: /** * Listen for connections. * * A node http.Server is returned, with this * application (which is a Function) as its * callback. If you wish to create both an HTTP * and HTTPS server you may do so with the “http” * and “https” modules as shown here: * * var http = require(‘http’) * , https = require(‘https’) * , express = require(‘express’) * , app = express(); * * http.createServer(app).listen(80); * https.createServer({ … }, app).listen(443); * * @return {http.Server} * @public */

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

综合koa和express的代码,可以看出,没有区别,但是这两个框架默认都是使用http,若使用https则需要自己收写。

回到顶部