You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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));

额外说明

  1. 若某个中间件是所有路由都需要的(如httpHeaderNormalizer),可直接添加到主middy()实例中,无需在每个路由的middleware里重复配置。
  2. 原eventSchema中required包含foo但未定义该字段的属性,会导致POST请求即使携带body也会验证失败,已在示例中修正。

内容的提问来源于stack exchange,提问作者user22626676

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:57:06