我目前正在使用
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 中有效地处理这些错误?是否有内置机制或者我需要实现自定义错误处理逻辑?任何示例或指导将不胜感激。预先感谢!
路由路径正则表达式模式确保该路由的处理程序仅处理匹配的模式。
由于无效路径与路由的模式不匹配,因此该端点将看不到该请求,并且无法处理请求的验证以返回错误。如果请求与任何其他路由不匹配,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'})
});