【问题标题】:Node.js Routes: Adding route handlers to an already instantiated http serverNode.js 路由:将路由处理程序添加到已经实例化的 http 服务器
【发布时间】:2014-06-04 16:23:46
【问题描述】:

如何将路由处理程序添加到已经存在并已实例化的 http 服务器

我发现的所有路由器(包括 express)似乎都要求将它们传递到 http.createServer() 方法中。

以快递为例:

var server = http.createServer(app);

我的主要标准:

  1. sockjs 之类的方式将路由添加到现有服务器。
  2. 不知道是否已经使用了任何路由器(如果有的话)
  3. 不要依赖现有的路由器“app”对象来添加路由(使用路由库创建一个新的就可以了)。

示例:将服务器传递给 SockJS

var http_server = http.createServer(); // agnostic    
sockjs_server.installHandlers(http_server, options);    
http_server.listen(...);

在 sockjs 源代码中完成的方式似乎很神秘......但我认为它涉及遍历现有处理程序并使用自定义路由器/处理程序覆盖它们。

非常感谢您的帮助!

【问题讨论】:

    标签: javascript node.js express routes


    【解决方案1】:

    嗯,http 服务器只不过是EventEmitter。它有一个request 事件,用于处理来自客户端的请求。

    因此,您可以做的一件事是围绕当前处理函数创建一个包装函数。例如,假设存在一些快速应用程序:

    var express = require('express');
    var app = express();
    
    app.get('/', function(req, res){
        res.send('Hello World!');
    });
    
    var server = app.listen(8080);
    

    所以,现在,您可以简单地查看服务器中当前注册的request 侦听器列表,删除旧的侦听器函数并将它们包装在一个新函数中,以按照您想要的方式处理您的请求。例如,您现在可以创建自己的路由器并根据其内容(即路径、内容类型、接受的语言等)确定通过哪个管道发送请求。

    server.listeners('request').forEach(function(listener){
        server.removeListener('request', listener);
        server.on('request', function(req, res){
            console.log('Before');
            listener(req,res);
            console.log('After');
        });
    });
    

    在上面的示例中,您可以看到我围绕侦听器函数的实际执行运行了几个console.log 语句。在这种情况下,侦听器函数实际上是 Express 主 request 处理程序。 express 处理程序代表一个管道,通过创建这个新的包装函数,您只需在管道的开头添加一个新管道。

    此技术将允许您首先处理请求并决定是要发送自己的响应并在此处终止请求,还是通过不同的管道发送它或将请求发送到快速管道(即旧的侦听器函数可用于您的新请求处理程序闭包)。

    【讨论】:

    • 这是票!!或者至少是我能得到的最接近的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多