我是nodejs的新手,也是socket.io和express的新手。我有一些有效的代码,但我很难理解为什么它正在工作。
我对以下代码的疑问是快递应用程序如何知道在端口80上收听?有一个server.listen。但是代码中没有app.listen。然而app.post()很容易接受发布的数据。
请考虑以下代码
var https = require('https');
var url = require('url');
var fs = require('fs');
var bodyParser = require('body-parser');
var express = require('express');
var app = express();
//var io = require('socket.io');
var zlib = require('zlib');
app.use(bodyParser.urlencoded({extended: true }));
var options = {
key: fs.readFileSync('my.key'),
cert: fs.readFileSync('my.crt')
};
var serverPort = 80;
var server = https.createServer(options, app);
var io = require('socket.io')(server);
// log when the server is ready
server.listen(serverPort, function() {
console.log('Web socket server up and running at port %s', serverPort);
// this prints 80, as expected
});
app.post('/api', function (req, res) {
// working code is in here that receives the post variables and responds
}
答案 0 :(得分:3)
使用Express,app
对象只是某个http服务器的请求处理程序。如果您致电app.listen()
,则app
对象将为您创建一个http服务器。但是,如果您已经创建了自己的http服务器(您的代码示例所做的那样),那么app
对象就会成为该服务器上的请求侦听器,并带有以下代码行:
var server = https.createServer(options, app);
创建http服务器并将app
注册为请求侦听器(因此它会查看所有传入请求)。这允许Express app对象然后处理在其中注册的路由到app.get(...)
或app.post(...)
等服务器路由。
并且,Express的端口是http服务器的端口,因此它是创建http服务器时使用的端口。这里要理解的重要事项是Express不是它自己的服务器。它只是一个http服务器的请求监听器。
在您的代码示例中,您的http服务器已设置为端口80,因此正在使用的端口和Express将作为请求处理程序注册到该端口上的所有传入http请求。
如果您查看source code for app.listen()
,就会看到:
app.listen = function listen() {
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
全部,它创建一个http服务器,将app
对象作为侦听器,然后在该新服务器上调用.listen()
。
答案 1 :(得分:1)
应用程序不必知道要侦听的端口。基本上,server
是您的HTTP服务器绑定,它在您的示例中侦听端口80。 var server = https.createServer(options, app);
然后告诉服务器在端口80上侦听HTTP请求并将它们转发到您的应用程序。然后,应用程序会执行将您使用app.post(...)
查询的功能链接到特定请求URL(在这种情况下为/ api)的路由内容。
TL; DR:应用程序不需要监听,因为服务器是外部唯一的通信接口。