javascript – Node.js路由:将路由处理程序添加到已经实例化的http服务器

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

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

例如用express:

var server = http.createServer(app);

我的主要标准:

>像sockjs这样的方式将路由添加到现有服务器.
>对任何已经使用的路由器(如果有的话)都是不可知的
>不依赖于现有的路由器“app”对象来添加路由(使用路由库创建一个新路径就可以了).

示例:将服务器传递给SockJS

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

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

非常感谢您的帮助!

解决方法:

好吧,http服务器只不过是一个EventEmitter.它有一个请求事件,它处理来自客户端的请求.

因此,您可以做的一件事是围绕当前处理函数创建一个包装函数.例如,让我们假设存在一些明确的应用:

var express = require('express');
var app = express();

app.get('/', function(req, res){
    res.send('Hello World!');
});

var server = app.listen(8080);

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

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主请求处理程序.表达式处理程序表示一个管道,通过创建这个新的包装器函数,您只需在管道的开头添加一个新管道.

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

上一篇:php – 如何在laravel routes文件中编写动态url方法?


下一篇:umi+antdpro 2.3