当 ID 与正则表达式模式不匹配时,如何处理 Hono 中间件中的错误?

问题描述 投票:0回答:1

我目前正在使用

bun
开发
Hono
应用程序。在我的其中一个路由中,我使用正则表达式定义了一个 URL 模式来匹配日期和标题参数。这是它的外观示例:

app.get('/post/:date{[0-9]+}/:title{[a-z]+}', (c) => {
  const { date, title } = c.req.param()
  // ...
})

日期参数的正则表达式模式

[0-9]+
和标题参数的
[a-z]+
确保仅接受特定格式。但是,当传入请求与这些模式不匹配时,我很难处理错误。

例如,如果用户发送的请求的 id 参数与

[0-9]+
模式不匹配,或者标题参数包含与 [
a-z]+
不匹配的字符,我想返回适当的自定义错误响应。

如何在 Hono 中有效地处理这些错误?是否有内置机制或者我需要实现自定义错误处理逻辑?任何示例或指导将不胜感激。预先感谢!

typescript validation error-handling bun hono
1个回答
0
投票

路由路径正则表达式模式确保该路由的处理程序仅处理匹配的模式。

由于无效路径与路由的模式不匹配,因此该端点将看不到该请求,并且无法处理请求的验证以返回错误。如果请求与任何其他路由不匹配,Hono 默认返回

404

多种实施可能性中的一些:

处理路由中的参数验证

为每个路径参数打开可接受的值类型,并在路由的验证器或处理程序中处理路径验证。

import {Hono} from 'hono';
import {validator} from "hono/validator";

const app = new Hono();

app.get('/post/:date/:title',
  // Add a param validator
  validator('param', (params, c) => {
    if (!(params.date && /[0-9]+/.test(params.date))) {
      c.status(400);
      return c.json({error: 'Date path parameter must only include digits.'});
    }
    if (!(params.title && /[a-z]+/.test(params.title))) {
      c.status(400);
      return c.json({error: 'Title path parameter must only include lowercase alphabet characters.'});
    }
  }),
  // Handler
  (c) => {
    const {date, title} = c.req.param();
    // Run param validation
    c.req.valid('param');
    // ... Other route handling logic
    return c.json({date, title});
  });
使用后备路线

使用

/post/01/ab
时,正则表达式路由匹配,而当其中一个参数与其正则表达式不匹配时,后备路由匹配,例如
/post/ab/ab

// Regex Route
app.get('/post/:date{[0-9]+}/:title{[a-z]+}', (c) => {
  return c.json({route: 'regex'})
});

// Fallback Route
app.get('/post/:date/:title', (c) => {
  return c.json({route: 'fallback'})
});
© www.soinside.com 2019 - 2024. All rights reserved.