搭建AWS Pinpoint短信注册系统时Lambda函数出现ReferenceError报错
解决AWS Lambda中"require is not defined in ES module scope"错误
问题场景
我在使用AWS Pinpoint和SNS搭建短信注册系统时,按照官方教程创建Lambda函数,替换示例代码并添加环境变量部署后,测试函数失败,报错信息如下:
Test Event Name MyFunctionTest Response { "errorType": "ReferenceError", "errorMessage": "require is not defined in ES module scope, you can use import instead", "trace": [ "ReferenceError: require is not defined in ES module scope, you can use import instead", " at file:///var/task/index.mjs:1:11", " at ModuleJob.run (node:internal/modules/esm/module_job:194:25)" ] }
错误原因
你的Lambda函数使用了ES模块(ESM)运行环境(比如Node.js 14+版本默认或手动配置为ESM),但官方提供的示例代码采用的是CommonJS语法(使用require导入模块、exports.handler定义入口),两种模块系统语法不兼容,导致运行时报错。
解决方案
方案1:切换Lambda为CommonJS模式
- 打开Lambda函数控制台,进入「代码」标签页
- 将代码文件的名称从
index.mjs修改为index.js - 保存并重新部署函数,再次测试即可
方案2:将代码改为ESM语法
把代码中的CommonJS语法替换为ESM规范:
// 替换原require导入为import import AWS from 'aws-sdk'; const pinpoint = new AWS.Pinpoint({region: process.env.region}); const projectId = process.env.projectId; const originationNumber = process.env.originationNumber; const message = "ExampleCorp: Reply YES to confirm your subscription. 2 msgs per " + "month. No purchase req'd. Msg&data rates may apply. Terms: " + "example.com/terms-sms"; const messageType = "TRANSACTIONAL"; // 替换exports.handler为export const handler export const handler = (event, context, callback) => { console.log('Received event:', event); validateNumber(event); }; // 以下函数逻辑保持不变 function validateNumber (event) { var destinationNumber = event.destinationNumber; if (destinationNumber.length == 10) { destinationNumber = "+1" + destinationNumber; } var params = { NumberValidateRequest: { IsoCountryCode: 'US', PhoneNumber: destinationNumber } }; pinpoint.phoneNumberValidate(params, function(err, data) { if (err) { console.log(err, err.stack); } else { console.log(data); if (data['NumberValidateResponse']['PhoneTypeCode'] == 0) { createEndpoint(data, event.firstName, event.lastName, event.source); } else { console.log("Received a phone number that isn't capable of receiving " +"SMS messages. No endpoint created."); } } }); } function createEndpoint(data, firstName, lastName, source) { var destinationNumber = data['NumberValidateResponse']['CleansedPhoneNumberE164']; var endpointId = data['NumberValidateResponse']['CleansedPhoneNumberE164'].substring(1); var params = { ApplicationId: projectId, EndpointId: endpointId, EndpointRequest: { ChannelType: 'SMS', Address: destinationNumber, OptOut: 'ALL', Location: { PostalCode:data['NumberValidateResponse']['ZipCode'], City:data['NumberValidateResponse']['City'], Country:data['NumberValidateResponse']['CountryCodeIso2'], }, Demographic: { Timezone:data['NumberValidateResponse']['Timezone'] }, Attributes: { Source: [ source ] }, User: { UserAttributes: { FirstName: [ firstName ], LastName: [ lastName ] } } } }; pinpoint.updateEndpoint(params, function(err,data) { if (err) { console.log(err, err.stack); } else { console.log(data); sendConfirmation(destinationNumber); } }); } function sendConfirmation(destinationNumber) { var params = { ApplicationId: projectId, MessageRequest: { Addresses: { [destinationNumber]: { ChannelType: 'SMS' } }, MessageConfiguration: { SMSMessage: { Body: message, MessageType: messageType, OriginationNumber: originationNumber } } } }; pinpoint.sendMessages(params, function(err, data) { if(err) { console.log(err.message); } else { console.log("Message sent! " + data['MessageResponse']['Result'][destinationNumber]['StatusMessage']); } }); }
修改完成后保存并部署函数,即可正常测试。
内容的提问来源于stack exchange,提问作者Brokenstick
相关产品推荐
相关产品推荐

