Express.js - app.listen vs server.listen

这可能是一个非常基本的问题,但我就是不明白。使用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);

有什么不同?< br > 如果我导航到http://localhost:1234,因此我得到相同的输出

172490 次浏览

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

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

使用应用程序和监听http服务器还有一个区别,那就是当你想设置为https服务器时

要设置https,你需要下面的代码:

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

来自express的应用程序将只返回http服务器,你不能在express中设置它,所以你需要使用https服务器命令

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

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

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

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

从# EYZ0

如果你想同时创建一个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看到他们的例子

看到# EYZ0

我更喜欢app.listen():)

只是为了守时,并延长一点Tim的回答 从# EYZ0: < / p >

express()返回的应用程序实际上是一个JavaScript函数, 设计为通过到Node的HTTP服务器作为要处理的回调 请求。< / p >

这使得同时提供HTTP和HTTPS版本的您的 应用程序具有相同的代码库,因为应用程序不继承这些 (它只是一个回调):

var https =require('https');
var http = require('http');
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
app.listen ()方法返回一个http。服务器对象和(对于HTTP)

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