node.js - NodeJS,如何编写正则表达式以动态路由路径
问题描述
我正在编写一个使用 JSON 对象作为清单的路由器。路由器使用 JSON 清单作为路由传入请求的 url 路径的参考。下面的代码属于使用 node 命令运行以启动应用程序的 main.js。在文档顶部附近,您可以看到将 JSON 清单作为参数的路由器对象。在这段代码下方,是另一段代码,它显示了路由器类写入其中的路由器文档,您可以在那里看到我如何尝试使用此 JSON Manifest 路由请求。
const app = require('./serv/katanaLib');
const Router = require('./serv/router');
var router = new Router.Router({
"^/(.*)$" : "/public/view/page/:[?]",
"^/user/(.*)$" : "/public/view/account/:[?]",
"^/style/(.*)$" : "/public/style/:[?]"
});
app.Server(8888, function(request, response)
{
const $_Request = app.parseHttpReq(request);
router.onReq($_Request);
});
- 下面是 router.js,这是我遇到问题的地方,我将在这个问题的底部解释。
module.exports.Router = class Router
{
constructor(JSON_manifest)
{
this.manifest = JSON_manifest;
this.keys = Object.keys(JSON_manifest);
this.values = Object.values(JSON_manifest);
};
onReq($_Request)
{
this.keys.forEach((key, i)=>
{
key = ('^' + key + '$');
var re = new RegExp(key, 'i');
let x = $_Request.path.search(re);
console.log('\n\n' + key);
console.log(re);
console.log(x + '\n\n');
});
};
};
任何人都可以清楚地看到,我正在将正则表达式写入 JSON 清单对象的键中。您可以看到我使用 foreach 循环搜索请求的路径,遍历每个清单键。我遇到的问题是我的正则表达式值匹配多次。当我运行上面的代码并向我的服务器发出以下请求时。
Request Recieved:
Parsed-Request:
{ path: '/index', method: 'GET', ext: '', type: 'text/html' }
^^/(.*)$$
/^^\/(.*)$$/i
0
^^/user/(.*)$$
/^^\/user\/(.*)$$/i
-1
^^/style/(.*)$$
/^^\/style\/(.*)$$/i
-1
这是一个理想的结果,但是当我运行时:
我明白了……
Parsed-Request:
{ path: '/user/abc', method: 'GET', ext: '', type: 'text/html' }
^^/(.*)$$
/^^\/(.*)$$/i
0
^^/user/(.*)$$
/^^\/user\/(.*)$$/i
0
^^/style/(.*)$$
/^^\/style\/(.*)$$/i
-1
正则表达式匹配第一个和第二个,这是不可取的。如果我请求http://localhost/style/123请求的路径将匹配第一个键和第三个键。如果有人对如何编写正则表达式有建议,那么我可以完成这个,那就太好了,谢谢...
解决方案
要解决多个正则表达式匹配的问题,最好按特定顺序测试它们,从最具体到最不具体。然后,将使用第一个匹配项。
在您的示例中,正则表达式作为对象键提供。由于对象键是无序的,因此您需要使用数组来控制正则表达式的顺序。
在这种情况下,正则表达式的顺序如下(第一个和第二个可以交换):
- ^/用户/(.*)$
- ^/样式/(.*)$
- ^/(.*)$
推荐阅读
- amazon-web-services - 如何允许用户删除 S3 存储桶中的对象?
- javascript - 如何在 vuejs 路由器链接中传递 laravel 变量?
- bash - bash:在bash文件的倒数第二行添加一个包含10行数据的变量
- swift - Swift - 以编程方式向堆栈视图添加标签
- c# - 如何初始化一个可选任务和任务
使用 C#? - sql - 返回我想要的数据的正确 SQL 语句是什么?
- html - 我如何让我的标志在我滚动时滚动?
- javascript - 未收到使用 Cloud Functions 发送的邮件
- r - 有没有办法在 R 中合并灰度图像 (JPEG) 以创建“RGB”通道?
- php - 如何在 Laravel 中将变量从“路由文件”导入到“组件文件”?