创建可访问AWS Amplify DataStore的Lambda函数遇报错求助
在AWS Lambda(Amplify Function)中使用Amplify DataStore的解决方案
问题原因
你遇到的ReferenceError: window is not defined错误,是因为Amplify DataStore默认面向浏览器环境开发,会依赖window这类浏览器专属API。而Lambda运行在Node.js后端环境中,不存在这些API,因此需要调整SDK的配置和使用方式,适配服务器端环境。
关键修复步骤
补充后端必要配置项
DataStore底层依赖AppSync实现数据同步,之前的配置缺少AppSync相关参数,必须补充才能正常初始化。同时添加ssr: true标记,告知SDK当前处于服务器端环境,避免调用浏览器API。优化DataStore运行模式
Lambda是短生命周期函数,不需要后台自动同步数据,因此关闭自动同步功能,避免不必要的资源消耗。移除冗余的start/stop调用
在服务器端环境中,DataStore会按需初始化资源,无需显式调用DataStore.start()和DataStore.stop(),反而可能引发异常。
可行代码示例
const { Amplify } = require('aws-amplify'); const { DataStore } = require('@aws-amplify/datastore'); const { Devices } = require('./models'); // 适配Lambda环境的Amplify配置 Amplify.configure({ aws_project_region: '你的AWS区域', aws_cognito_identity_pool_id: '你的Cognito身份池ID', aws_cognito_region: '你的AWS区域', aws_user_pools_id: '你的Cognito用户池ID', aws_user_pools_web_client_id: '你的Cognito客户端ID', // 新增AppSync配置(必须项) aws_appsync_graphqlEndpoint: '你的AppSync GraphQL端点', aws_appsync_region: '你的AWS区域', aws_appsync_authenticationType: 'AMAZON_COGNITO_USER_POOLS', // 匹配你的认证类型,如API_KEY // 启用服务器端渲染模式,避免浏览器API依赖 ssr: true, }); // 配置DataStore为Lambda环境优化:关闭自动后台同步 DataStore.configure({ syncInterval: 0, syncPageSize: 100, }); /** * @type {import('@types/aws-lambda').APIGatewayProxyHandler} */ exports.handler = async (event) => { console.log(`EVENT: ${JSON.stringify(event)}`); try { // 直接执行DataStore查询 const items = await DataStore.query(Devices); console.log('Devices DataStore查询结果: ' + JSON.stringify(items)); return { statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ devices: items }), }; } catch (error) { console.error('DataStore操作失败:', error); return { statusCode: 500, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ error: error.message }), }; } };
本地Mock测试注意事项
- 先启动AppSync mock服务:运行
amplify mock api,确保本地GraphQL端点可用。 - 再运行Lambda mock:
amplify mock function function_name,避免因AppSync服务未启动导致的连接失败。 - 确认
models目录已通过amplify codegen models正确生成,Devices模型定义无误。
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

