正则表达式在 Fastify 路由中不匹配
Regex not matching in Fastify route
我决定将我的代码从 Express 移植到 Fastify。所以当我们没有设置适当的测试时,这是一个很头疼的问题。
无论如何,路线声明为:
fastify.get(/^\/(donations|skills|blogs)/, async function (req, reply) {
它在 Express 中工作,但在 Fastify 中它返回 404。我确定它与正则表达式本身有关,因为同一 plugin/file/ 中的其他路由正常工作。
它应该匹配/listings/donations
或listings/skills
...知道/listings
是将整个路由插件附加到应用程序时的前缀。
要回复您的答案,您不能向 Fastify 提供 RegExp 对象。您需要在 RegExp:
中设置 path-parameter
const fastify = require('fastify')({ logger: true })
const handler = async (request, reply) => {
return { hello: request.params.foo }
}
fastify.get('/listings/:foo(^(donations|skills|blogs)$)', handler)
fastify.listen(8080)
(我认为您的设置应该出错,所以我打开了 an issue)
建议您不要这样做:您会因为这个正则表达式而导致性能下降。
我建议你这样写:
fastify.get('/listings/donations)', handler)
fastify.get('/listings/skills)', handler)
fastify.get('/listings/blogs', handler)
让路由器完成它的工作。
这是性能比较:
使用正则表达式
┌───────────┬─────────┬─────────┬─────────┬─────────┬──────────┬─────────┬─────────┐
│ Stat │ 1% │ 2.5% │ 50% │ 97.5% │ Avg │ Stdev │ Min │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Req/Sec │ 68863 │ 68863 │ 75327 │ 75839 │ 73678.55 │ 2791.45 │ 68860 │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Bytes/Sec │ 12.5 MB │ 12.5 MB │ 13.7 MB │ 13.8 MB │ 13.4 MB │ 507 kB │ 12.5 MB │
└───────────┴─────────┴─────────┴─────────┴─────────┴──────────┴─────────┴─────────┘
没有正则表达式
┌───────────┬─────────┬─────────┬─────────┬─────────┬──────────┬─────────┬─────────┐
│ Stat │ 1% │ 2.5% │ 50% │ 97.5% │ Avg │ Stdev │ Min │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Req/Sec │ 86015 │ 86015 │ 95423 │ 95551 │ 94350.55 │ 2681.36 │ 85954 │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Bytes/Sec │ 15.6 MB │ 15.6 MB │ 17.4 MB │ 17.4 MB │ 17.2 MB │ 491 kB │ 15.6 MB │
└───────────┴─────────┴─────────┴─────────┴─────────┴──────────┴─────────┴─────────┘
我决定将我的代码从 Express 移植到 Fastify。所以当我们没有设置适当的测试时,这是一个很头疼的问题。
无论如何,路线声明为:
fastify.get(/^\/(donations|skills|blogs)/, async function (req, reply) {
它在 Express 中工作,但在 Fastify 中它返回 404。我确定它与正则表达式本身有关,因为同一 plugin/file/ 中的其他路由正常工作。
它应该匹配/listings/donations
或listings/skills
...知道/listings
是将整个路由插件附加到应用程序时的前缀。
要回复您的答案,您不能向 Fastify 提供 RegExp 对象。您需要在 RegExp:
中设置 path-parameterconst fastify = require('fastify')({ logger: true })
const handler = async (request, reply) => {
return { hello: request.params.foo }
}
fastify.get('/listings/:foo(^(donations|skills|blogs)$)', handler)
fastify.listen(8080)
(我认为您的设置应该出错,所以我打开了 an issue)
建议您不要这样做:您会因为这个正则表达式而导致性能下降。 我建议你这样写:
fastify.get('/listings/donations)', handler)
fastify.get('/listings/skills)', handler)
fastify.get('/listings/blogs', handler)
让路由器完成它的工作。
这是性能比较:
使用正则表达式
┌───────────┬─────────┬─────────┬─────────┬─────────┬──────────┬─────────┬─────────┐
│ Stat │ 1% │ 2.5% │ 50% │ 97.5% │ Avg │ Stdev │ Min │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Req/Sec │ 68863 │ 68863 │ 75327 │ 75839 │ 73678.55 │ 2791.45 │ 68860 │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Bytes/Sec │ 12.5 MB │ 12.5 MB │ 13.7 MB │ 13.8 MB │ 13.4 MB │ 507 kB │ 12.5 MB │
└───────────┴─────────┴─────────┴─────────┴─────────┴──────────┴─────────┴─────────┘
没有正则表达式
┌───────────┬─────────┬─────────┬─────────┬─────────┬──────────┬─────────┬─────────┐
│ Stat │ 1% │ 2.5% │ 50% │ 97.5% │ Avg │ Stdev │ Min │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Req/Sec │ 86015 │ 86015 │ 95423 │ 95551 │ 94350.55 │ 2681.36 │ 85954 │
├───────────┼─────────┼─────────┼─────────┼─────────┼──────────┼─────────┼─────────┤
│ Bytes/Sec │ 15.6 MB │ 15.6 MB │ 17.4 MB │ 17.4 MB │ 17.2 MB │ 491 kB │ 15.6 MB │
└───────────┴─────────┴─────────┴─────────┴─────────┴──────────┴─────────┴─────────┘