这可能是一个非常基本的问题,但我根本不明白。使用 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
,我会得到相同的输出。
如果您想重用 HTTP 服务器,例如在同一个 HTTP 服务器实例中运行 socket.io
,则第二种形式(您自己创建一个 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) {
...
});
使用应用程序和收听 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);
只是为了准时目的并扩展一点蒂姆的答案。
来自official documentation:
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);
};
express/lib/appplication.js
中找到,只不过是创建节点 http 服务器的快捷方式。
var https = require('https'); var http = require('http');
我提出了同样的问题,但在谷歌之后,我发现没有太大区别:)
来自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()
:)
Express 基本上是 http 模块的包装器,它是为方便开发人员而创建的,其方式是......
他们可以使用 express 设置中间件来(轻松地)响应 HTTP 请求。他们可以基于使用 express 向模板传递参数来动态呈现 HTML 页面。他们还可以使用 express 轻松定义路由。
===
比较当然会失败;)如果您不相信我,there is always the source。app.listen()
因为它需要更少的代码。由于它只是server.listen()
之上的一个非常薄的层,并且它返回服务器实例,因此通常没有理由手动创建单独的 HTTP 服务器实例。app.listen()
(Express)将创建一个常规 HTTP 服务器(通过使用http.createServer()
);如果你想通过 HTTPS 运行 Express,你需要单独使用https.createServer()
并将 Express “附加”到它(或使用单独的 HTTPS 服务器,如 nginx 作为 HTTPS 终止符)。