gpt4 book ai didi

node.js - Express.js 中路由参数的正则表达式

转载 作者:搜寻专家 更新时间:2023-11-01 00:17:06 25 4
gpt4 key购买 nike

根据各种文档和博客,以及 this question和其他人,我知道可以使用正则表达式来验证路由参数。然而,这让我搜索了大约一个半小时:

app.get('/api/:url(/^http:\/\/(.+?)\.(.+?)$/)', (req, res) => {
// do stuff with req.params.url
});

每次我在本地运行服务器并输入 localhost://8000/api/http://www.google.com 时,响应都是 Cannot GET/new/http ://www.google.com

我知道正则表达式做我想做的事,因为:

/^http:\/\/(.+?)\.(.+?)$/.test('http://www.google.com');

...返回真。

我还尝试将路由字符串更改为...

'/api/:url(^http:\/\/(.+?)\.(.+?)$)'

'/api/:url(http:\/\/(.+?)\.(.+?))'

'/api/:url/^http:\/\/(.+?)\.(.+?)$/'

还有其他几种格式,看起来与 Stack Overflow 线程和博客中给出的示例完全不同(Express 文档绝对没有在第一个路由参数之外使用正则表达式的示例)。也许有一些我不知道的格式限制,或者 Express 中对 RegExp 支持的限制?如果文档能说明什么,那就太好了。

我很感激能在这里得到任何帮助。

最佳答案

对于您要实现的目标,您的正则表达式是错误的。

TL;DR 使用这个:

app.get('/api/:url(https?:\/\/?[\da-z\.-]+\.[a-z\.]{2,6}\/?)', (req, res) => {
});

一些解释:

首先,path-to-regexp,express 使用的模块正如其名称所说:将路径转换为正则表达式。因此,^$ anchor 要么是非法的,要么在放置在您的 :url() 内容( path-to-regexp 已经使用了它们)。另外,不要包含 JavaScript 中用来标识 RegExp 对象的斜线,而只包含表达式内容。

下面是 express 查看正则表达式的方式:

path: '/api/:url(/^http://(.+?).(.+?)$/)'
regexp: /^\/api\/(?:(\/^http:\/\/(?:\.+?))\.(\.+?)$\/)\/?$/i

path: '/api/:url(^http://(.+?).(.+?)$)'
regexp: /^\/api\/(?:(^http:\/\/(?:\.+?))\.(\.+?)$)\/?$/i

path: '/api/:url(http://(.+?).(.+?))'
regexp: /^\/api\/(?:(http:\/\/(?:\.+?))\.(\.+?))\/?$/i

path: '/api/:url/^http://(.+?).(.+?)$/
regexp: /^\/api\/(?:([^\/]+?))\/^http:\/\/(?:\.+?)\.(\.+?)$\/?$/i

并且,使用这样的代码片段,您可以看到没有一个匹配:

const url = 'http://www.google.com';
for (let layer of app._router.stack) {
if (layer.name === 'bound dispatch') {
console.log(layer.regexp + ': matches', url, '=', layer.regexp.test(url));
}
}

还建议避免在已命名的捕获中使用捕获括号。

示例 (注意 URI 方案周围的额外括号,以及它们如何更改 req.params.url 值):

app.get('/api/:url((https?:\/\/)?[\da-z\.-]+\.[a-z\.]{2,6}\/?)', (req, res) => {})

> req.params: { '0': 'http://', url: 'http://' }

稍后编辑:请注意,整篇文章仅涉及包含正则表达式的字符串 路由,而不是使用 RegExp 对象定义的路由。

关于node.js - Express.js 中路由参数的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38155631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com