Serverless中间件未触发调用问题求助
Serverless AWS Node.js 中
serverless-middleware 中间件未被调用的问题 问题详情
我开发serverless aws-nodejs应用时,尝试用serverless-middleware实现认证中间件,用来检查会话Cookie并将用户ID附加到context中。但实际运行时,中间件完全没被调用——预期控制台会输出[Authorize] this is being run且返回401未授权响应,结果只有主处理器token.js的日志输出。
中间件代码(handlers/user/authorize.js)
async function handler(event, context) { let headers = { "Access-Control-Allow-Origin": event.headers.origin, "Access-Control-Allow-Credentials": true } console.log("[Authorize]", "this is being run") let cookies = CookieParser(event.headers.Cookie) if(!cookies.session) return { statusCode: 401, headers, body: JSON.stringify("Unauthorized") } const decoded = jwt.decode(cookies.session, process.env.JWT_SECRET) console.log("[Authorize.decoded]", decoded); if(!decoded.id) return { statusCode: 401, headers, body: JSON.stringify("Unauthorized") } return { context: { user: decoded.id } } } module.exports.handler = handler;
主处理器代码(handlers/user/token.js)
async function handler(event, context) { let headers = { "Access-Control-Allow-Origin": event.headers.origin, "Access-Control-Allow-Credentials": true } console.log("[User.Token.event]", event) console.log("[User.Token.context]", context) return { statusCode: 200, headers, body: JSON.stringify("Success") } } module.exports.handler = handler;
serverless.yml配置
functions: token: middleware: - handlers/user/authorize.handler handler: handlers/user/token.handler events: - http: path: /user/token method: get cors: true
解决方案
1. 确保serverless-middleware插件已安装并启用
这是最常见的遗漏步骤:
- 先安装插件:
npm install serverless-middleware --save-dev - 在
serverless.yml顶部添加plugins配置,启用插件:plugins: - serverless-middleware
没有启用插件的话,middleware配置项不会被Serverless Framework识别,自然不会执行中间件。
2. 验证中间件路径正确性
检查handlers/user/authorize.handler的路径是否与项目文件结构匹配,确保相对于serverless.yml的位置是正确的(比如大小写、目录层级是否一致)。
3. 检查Serverless版本兼容性
旧版本的Serverless Framework可能和serverless-middleware存在兼容性问题,建议升级到稳定版:
npm update -g serverless
4. 确认中间件返回格式合规
虽然当前问题是中间件未执行,但后续测试时要确保中间件返回格式正确:
- 若要继续执行主处理器,返回
{ context: ... } - 若要终止流程直接返回响应,返回完整的HTTP响应对象(如你代码中的401返回格式)
内容的提问来源于stack exchange,提问作者Ryne
相关产品推荐
相关产品推荐

