使用Express的Socket.io,快递应用程序如何知道要侦听的端口?

时间:2016-06-26 21:19:09

标签: node.js express socket.io

我是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
}

2 个答案:

答案 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:应用程序不需要监听,因为服务器是外部唯一的通信接口。