如何将路由处理程序添加到已存在并已实例化的http服务器?
我发现的所有路由器(包括Express)似乎都要求将它们传递到http.createServer()
方法中。
例如,express:
var server = http.createServer(app);
我的主要标准:
示例:将服务器传递到SockJS
var http_server = http.createServer(); // agnostic
sockjs_server.installHandlers(http_server, options);
http_server.listen(...);
在sockjs源代码中完成它的方式似乎很神秘……但是我认为它涉及遍历现有处理程序并使用自定义路由器/处理程序覆盖它们。
非常感谢您的帮助!
嗯,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处理程序代表一个管道,通过创建此新包装器函数,您只需在管道的开头添加了一个新管道。
这种技术可以让您先处理请求,然后决定是要发送自己的响应并在此处终止请求,还是通过其他管道发送请求,还是通过快速管道发送请求(即,您的旧监听器功能可用)新的请求处理程序关闭)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句