You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

搭建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:26:06