Nodejs中express里http.createServer和app.listen有什么区别?

Nodejs中express里http.createServer和app.listen有什么区别?

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

15 回复

Node.js 中 Express 里 http.createServerapp.listen 的区别

在使用 Express 构建 Web 应用时,你可能会遇到两种不同的方法来启动服务器:一种是直接使用 Express 的 app.listen 方法,另一种是通过 Node.js 的 http.createServer 方法。这两种方法虽然最终都能达到启动服务器的目的,但在实现方式和适用场景上有所不同。

1. app.listen

这是 Express 提供的一个便捷方法,用于快速启动 HTTP 服务器。它内部封装了 Node.js 的 http.createServer 方法,并且做了许多简化处理。通常情况下,使用 app.listen 是最简单和最直接的方式。

示例代码:

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

// 使用 app.listen 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

2. http.createServer

这是 Node.js 核心模块 http 提供的方法,用于创建一个 HTTP 服务器。你可以将 Express 应用(即 app 对象)作为参数传递给 createServer 方法,从而让 Express 处理请求。这种方法更灵活,因为它允许你在创建服务器时添加更多自定义逻辑。

示例代码:

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

// 使用 http.createServer 创建服务器
http.createServer(app).listen(80, () => {
    console.log('Server is running on port 80');
});

区别总结

  • 简洁性app.listen 更简洁,适合快速搭建简单的应用。
  • 灵活性http.createServer 更灵活,可以让你在创建服务器时添加额外的中间件或处理逻辑。
  • 内部实现app.listen 实际上是调用了 http.createServer,但提供了更多的默认配置和便利方法。

在大多数情况下,如果你只是想快速搭建一个简单的 Express 应用,使用 app.listen 就足够了。而如果你需要对服务器有更精细的控制,或者想要添加一些特殊的处理逻辑,那么使用 http.createServer 会是一个更好的选择。


up

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);
}; 

以上。

楼上这段代码正解。

http.createServerapp.listen 在 Express 中有不同的使用场景和功能。

  1. app.listen: 这是 Express 提供的一个简化的方法来启动一个 HTTP 服务器。当你调用 app.listen(3000) 时,Express 会自动创建一个 HTTP 服务器并将应用(即 app)绑定到该服务器上。这使得代码更简洁,更易于理解。

    示例代码:

    var express = require('express');
    var app = express();
    
    app.get('/', function (req, res) {
      res.send('Hello World!');
    });
    
    app.listen(3000, () => console.log('Example app listening on port 3000!'));
    
  2. http.createServer: 这是 Node.js 的原生 http 模块提供的方法。它允许你创建一个 HTTP 服务器,并将 Express 应用作为请求处理程序传递给服务器。这提供了更大的灵活性,因为你可以为同一个服务器添加多个不同的处理程序或中间件。

    示例代码:

    var express = require('express');
    var http = require('http');
    var app = express();
    
    app.get('/', function (req, res) {
      res.send('Hello World!');
    });
    
    var server = http.createServer(app);
    server.listen(80, () => console.log('Server is running on port 80'));
    

总结

  • 使用 app.listen 是更简洁的方式,适合大多数情况。
  • 使用 http.createServer 提供了更多的控制权和灵活性,特别是在你需要在一个服务器上运行多个不同的服务时。

两者都能实现相同的功能,选择哪个取决于你的具体需求。

回到顶部