Express.js - app.listen vs server.listen

时间:2013-07-17 10:01:51

标签: node.js express server

这可能是一个非常基本的问题,但我根本就没有得到它。使用 Express.js 创建应用程序和启动应用程序侦听端口1234之间有什么区别,例如:

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

//app.configure, app.use etc

app.listen(1234);

并添加http服务器:

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

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

//app.configure, app.use etc

server.listen(1234);

有什么区别?
如果我导航到http://localhost:1234,那么我得到相同的输出。

5 个答案:

答案 0 :(得分:471)

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

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

答案 1 :(得分:48)

使用该应用程序还有一个区别,当您要为https服务器设置时,正在侦听http服务器

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

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

来自快递的app只会返回http服务器,你不能在express中设置它,所以你需要使用https服务器命令

var express = require('express');
var app = express();
app.listen(1234);

答案 2 :(得分:17)

只是为了守时的目的并延长一点蒂姆的回答 来自official documentation

  

express()返回的app实际上是一个JavaScript函数,   设计为通过到Node的HTTP服务器作为回调来处理   请求。

     

这样可以轻松提供您的HTTP和HTTPS版本   具有相同代码库的应用程序,因为应用程序不会从这些继承   (这只是一个回调):

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

答案 3 :(得分:5)

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

  1. 他们可以设置中间件来使用快速(轻松)响应HTTP请求。
  2. 他们可以基于使用express传递参数到模板来动态呈现HTML页面。
  3. 他们还可以使用express轻松定义路由。

答案 4 :(得分:4)

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

来自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,请参阅他们的example

请参阅this

我更喜欢app.listen() :)