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

Node.js调用resendOTP接口时出现'then is undefined'报错如何解决

问题原因
  • sendSms函数没有返回Promise对象,默认返回值为undefined,而.then是Promise专属的实例方法,调用undefined的then属性就会触发该TypeError。
  • 当前sendSms内部调用的sns.publish使用的是回调式写法,没有将异步结果包装为Promise返回给调用方。
解决方法

首先需要改造sendSms函数,使其返回Promise,有两种常用实现方式:

方式1:手动封装Promise

function sendSms(phoneNumber, body) {
  return new Promise((resolve, reject) => {
    const params = {
      Message: body,
      MessageStructure: 'string',
      PhoneNumber: phoneNumber
    };
    sns.publish(params, function (err, data) {
      if (err) {
        console.log(err, err.stack);
        return reject(err);
      }
      resolve(data);
    });
  })
}

方式2:直接使用AWS SDK内置的promise转换

AWS SDK v2的所有异步方法都支持调用.promise()直接返回Promise对象,无需手动封装回调:

function sendSms(phoneNumber, body) {
  const params = {
    Message: body,
    MessageStructure: 'string',
    PhoneNumber: phoneNumber
  };
  return sns.publish(params).promise();
}

可选优化:调用端改用await写法

因为resendOTP本身已经是async函数,用await代替.then写法更简洁易读,同时补充错误捕获逻辑避免未处理的Promise异常:

exports.resendOTP = async(req, res) => {
  try {
    const { id } = req.body;
    const user = await User.findOne({ _id: id });
    if (!user) {
      return res.status(200).send({
        message: "User was not found"
      });
    }
    const OTP = Math.floor(1000 + Math.random() * 9000);
    const encryptOTP = encrypt(OTP.toString());
    const body = `Hi, ${OTP} is your One Time Password.`;
    await sendSms(user.countryCode + user.phoneNumber, body);
    res.status(200).send({
      message: "Updated Sucessfully"
    });
  } catch (err) {
    console.error('操作失败', err);
    res.status(500).send({
      message: "短信发送失败,请稍后重试"
    });
  }
}

内容的提问来源于stack exchange,提问作者Suman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 01:15:05