使用Middy HTTP Router时验证器全局执行的异常问题咨询
问题原因
你错误地将已通过middy()包装的实例作为路由handler传递给httpRouterHandler。Middy的HTTP Router组件要求路由handler是原始Lambda函数,而非预包装的middy实例。当传入middy实例时,其内部的中间件(如postBookHandler中的validator)会被合并到全局中间件链中,导致所有请求(包括未配置验证的GET请求)都执行该验证逻辑,从而出现不符合预期的验证失败。
解决办法
将路由handler改为原始Lambda函数,通过路由配置的middleware字段为特定路由绑定对应的中间件,实现中间件的隔离生效。
修改后的代码示例
import middy from '@middy/core'; import httpRouterHandler, { Route } from '@middy/http-router'; import httpHeaderNormalizer from '@middy/http-header-normalizer'; import validator from '@middy/validator'; import { transpileSchema } from '@middy/validator/transpile'; import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; // 修正Schema:补充foo字段定义(原schema中required包含foo但未定义属性) const eventSchema = { type: 'object', required: ['body', 'foo'], properties: { body: { type: 'string' }, foo: { type: 'string' } // 补充foo字段的类型定义 } }; // 定义原始Lambda handler函数,不再用middy单独包装 const getBookHandler = (event: APIGatewayEvent, context: Context): APIGatewayProxyResult => { return { statusCode: 200, body: JSON.stringify({ message: 'get Book' }) }; }; const postBookHandler = (event: APIGatewayEvent, context: Context): APIGatewayProxyResult => { return { statusCode: 200, body: JSON.stringify({ message: 'post Book' }) }; }; const postBookContentHandler = (event: APIGatewayEvent, context: Context): APIGatewayProxyResult => { return { statusCode: 200, body: JSON.stringify({ message: 'post Book Content' }) }; }; const routes: Route[] = [ { method: 'GET', path: '/book', handler: getBookHandler, // 该路由专属中间件(如果全局已添加httpHeaderNormalizer,可省略) middleware: [httpHeaderNormalizer()] }, { method: 'POST', path: '/book', handler: postBookHandler, // 仅该路由应用validator中间件 middleware: [validator({ eventSchema: transpileSchema(eventSchema) })] }, { method: 'POST', path: '/book/contents', handler: postBookContentHandler, middleware: [httpHeaderNormalizer()] } ]; // 主handler:全局中间件可在此添加(如所有路由都需要httpHeaderNormalizer,可放在这里) export const handler = middy() // .use(httpHeaderNormalizer()) // 若全局需要,取消注释,路由中的对应middleware可删除 .handler(httpRouterHandler(routes));
额外说明
- 若某个中间件是所有路由都需要的(如
httpHeaderNormalizer),可直接添加到主middy()实例中,无需在每个路由的middleware里重复配置。 - 原
eventSchema中required包含foo但未定义该字段的属性,会导致POST请求即使携带body也会验证失败,已在示例中修正。
内容的提问来源于stack exchange,提问作者user22626676
相关产品推荐
相关产品推荐

