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
相关产品推荐
相关产品推荐

