Netlify部署Apollo Server Lambda时handler无法识别事件如何解决?
问题原因
这个报错是因为Apollo Server Lambda默认依赖的@vendia/serverless-express只识别AWS Lambda原生事件结构,而Netlify Functions的触发事件格式存在差异,导致无法识别事件源。
解决方案
第一步:调整handler代码适配Netlify事件格式
把原有导出handler的逻辑替换为如下代码,先对Netlify的事件做格式转换后再传入Apollo原生handler:
// 保留你原有的cors配置 const apolloHandler = server.createHandler({ cors: { origin: '*' } }); exports.handler = async (event, context) => { // 转换Netlify事件为Apollo可识别的AWS Lambda兼容格式 event.httpMethod = event.requestContext.http.method; // 修正路径匹配规则,也可以直接把${process.env.AWS_LAMBDA_FUNCTION_NAME}替换为你的函数文件名,比如graphql event.path = event.rawUrl.split(`.netlify/functions/${process.env.AWS_LAMBDA_FUNCTION_NAME}`)[1] || event.path; // 补齐缺失的头信息 event.headers = { ...event.headers, host: event.headers['x-forwarded-host'] || event.headers.host }; return apolloHandler(event, context); };
第二步:配置函数路径(可选)
如果希望通过/graphql路径直接访问服务,不需要带Netlify函数默认的/.netlify/functions/前缀,可以在项目根目录的netlify.toml文件中添加重定向规则:
[build] # 配置你的构建命令和输出目录,保持和你原有配置一致即可 command = "npm run build" functions = "netlify/functions" [[redirects]] from = "/graphql" to = "/.netlify/functions/graphql" status = 200
注意事项
部署完成后访问对应服务路径,正常加载Apollo Sandbox即可使用。如果有生产环境跨域需求,建议将cors配置中的*替换为实际的前端域名,提升安全性。
内容的提问来源于stack exchange,提问作者Guru
相关产品推荐
相关产品推荐

