【问题标题】:Socket.io with Express, how does express app know what port to listen on?带有 Express 的 Socket.io,express 应用程序如何知道要监听的端口?
【发布时间】:2016-06-27 10:09:48
【问题描述】:

我对 nodejs 很陌生,对 socket.io 和 express 也很陌生。我有一些正在运行的代码,但无法准确理解其运行的原因。

我对以下代码的问题是 express 应用程序如何知道监听端口 80?有一个服务器。听。但是代码中没有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
}

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    使用 Express,app 对象只是一些 http 服务器的请求处理程序。如果您调用app.listen(),那么app 对象将为您创建一个http 服务器。但是,如果您已经创建了自己的 http 服务器(您的代码示例就是这样做的),那么 app 对象将成为该服务器上的请求侦听器,并使用您的以下代码行:

    var server = https.createServer(options, app);
    

    这将创建 http 服务器并将 app 注册为请求侦听器(因此它可以查看所有传入请求)。这允许 Express 应用程序对象随后将向其注册的路由处理到服务器路由,例如 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);
    };
    

    它所做的只是用app 对象作为侦听器创建一个http 服务器,然后在该新服务器上调用.listen()

    【讨论】:

    • 谢谢!这真的很清楚。当某些事情奏效而我不明白为什么时,这很令人沮丧。
    【解决方案2】:

    应用不必知道监听哪个端口。基本上,server 是您的 HTTP 服务器绑定,在您的示例中侦听端口 80。 var server = https.createServer(options, app); 然后告诉服务器在端口 80 上侦听 HTTP 请求并将它们转发到您的应用程序。然后,该应用程序执行路由内容,将您使用 app.post(...) 指定的函数链接到特定请求 URL(在本例中为 /api)。

    TL;DR:应用程序不需要监听,因为服务器是与外界的唯一通信接口。

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 2018-10-29
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多