Amplify运行或模拟使用aws-appsync的Lambda函数时报错如何解决?
错误原因
aws-appsync 库最初设计优先兼容浏览器运行环境,默认依赖浏览器全局对象(window、navigator)和fetch API,而Node.js运行时(包括Lambda线上环境和本地mock环境)没有内置这些全局变量,库初始化阶段就会抛出未定义错误,最终导致Lambda无法加载handler函数。
修复方案
- 第一步:在Lambda函数目录下安装配套依赖
注意:要进入你函数对应的文件夹(一般是amplify/backend/function/<your-function-name>/src目录,包含package.json的路径)执行安装命令:npm install aws-appsync cross-fetch aws-sdk graphql graphql-tag - 第二步:修改Lambda代码,补充环境兼容配置
完整可运行的代码示例如下:// 引入fetch的polyfill兼容Node.js环境 require('cross-fetch/polyfill'); // 补充全局变量定义,解决aws-appsync的浏览器依赖问题 global.navigator = global.navigator || {}; global.navigator.userAgent = global.navigator.userAgent || 'Node.js'; global.window = global.window || { fetch: global.fetch }; const AWSAppSyncClient = require('aws-appsync').default; const { AUTH_TYPE } = require('aws-appsync'); const aws = require('aws-sdk'); // 初始化AppSync客户端 const client = new AWSAppSyncClient({ url: process.env.APPSYNC_API_URL, // 建议通过Amplify环境变量注入,不要硬编码 region: process.env.AWS_REGION, auth: { type: AUTH_TYPE.AWS_IAM, // 可根据你的鉴权方式替换为API_KEY/AMAZON_COGNITO_USER_POOLS等 credentials: aws.config.credentials, }, disableOffline: true // 必须开启,Lambda是无状态运行环境,要关闭离线缓存功能 }); exports.handler = async (event) => { console.log(event); // 此处可正常编写调用AppSync的业务逻辑 return { statusCode: 200, body: JSON.stringify('执行成功') } }; - 第三步:配置Lambda执行权限
如果你使用IAM鉴权调用AppSync,执行amplify update function选择对应函数,在权限配置项中勾选AppSync API的调用权限,Amplify会自动为Lambda执行角色配置对应IAM策略,无需手动修改。 - 第四步:验证修复
执行amplify mock function <your-function-name>做本地测试,确认无报错后再部署到线上环境验证即可。
内容的提问来源于stack exchange,提问作者Lalle
相关产品推荐
相关产品推荐

