586

This may be a very basic question but I simply don't get it. What is the difference between creating an app using Express.js and starting the app listening on port 1234, for example:

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

//app.configure, app.use etc

app.listen(1234);

and adding an http server:

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

var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

What's the difference?
If I navigate to http://localhost:1234, thus I get the same output.

4

5 回答 5

690

socket.io如果您想重用 HTTP 服务器,例如在同一个 HTTP 服务器实例中运行,则第二种形式(自己创建一个 HTTP 服务器,而不是让 Express 为您创建一个)很有用:

var express = require('express');
var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);
...
server.listen(1234);

但是,app.listen()它也会返回 HTTP 服务器实例,因此只需进行一些重写,您就可以在不自己创建 HTTP 服务器的情况下实现类似的效果:

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

// app.use/routes/etc...

var server    = app.listen(3033);
var io        = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
  ...
});
于 2013-07-17T10:18:49.460 回答
80

使用应用程序和收听 http 服务器的另一个区别是当您要设置 https 服务器时

要设置 https,您需要以下代码:

var https = require('https');
var server = https.createServer(app).listen(config.port, function() {
    console.log('Https App started');
});

express 的应用程序只会返回 http server,你不能在 express 中设置它,所以你需要使用 https server 命令

var express = require('express');
var app = express();
app.listen(1234);
于 2014-05-29T03:07:28.013 回答
54

只是为了准时目的并扩展一点蒂姆的答案。
来自官方文档

express () 返回的应用程序实际上是一个 JavaScript 函数, 旨在传递给 Node 的 HTTP 服务器作为处理请求的回调。

这使得为​​您的应用程序的 HTTP 和 HTTPS 版本提供相同的代码库变得很容易,因为应用程序不会从这些版本继承(它只是一个回调):

var https =require('https');
var http = require('http');
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

app.listen ()方法返回一个http.Server对象,并且(对于 HTTP)是以下的便捷方法

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
于 2017-03-20T11:01:40.510 回答
15

我提出了同样的问题,但在谷歌之后,我发现没有太大区别:)

来自Github

如果您希望同时创建 HTTP 和 HTTPS 服务器,您可以使用此处所示的“http”和“https”模块来实现。

/**
 * 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}
 * @api public
 */

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

另外,如果您想使用 socket.io,请参阅他们的示例

看到这个

我更喜欢app.listen():)

于 2016-04-12T11:03:36.703 回答
11

Express 基本上是 http 模块的包装器,它是为方便开发人员而创建的,其方式是......

  1. 他们可以使用 express 设置中间件来(轻松地)响应 HTTP 请求。
  2. 他们可以基于使用 express 向模板传递参数来动态呈现 HTML 页面。
  3. 他们还可以使用 express 轻松定义路由。
于 2015-12-04T13:12:18.293 回答