javascript - 等待 AWS SNS 发布回调将值返回给调用方法

标签 javascript node.js async-await amazon-sns aws-sdk-js

我正在尝试在用户请求重设密码时发送短信。我想等待发送消息以提醒用户是否成功。我目前正在尝试按如下方式进行:

async function sendResetPasswordTextMessage(req, res) {
    let result = {};

    let phoneNumber = req.body.phoneNumber;                

    if (phoneNumber === undefined) {                       
        return sendInvalidParametersMessage(res);          
    }                                                      

    phoneNumber = phoneNumber.toString();                  

    const userProfile = await models.UserProfile.findOne({ 
        where: {                                           
            phoneNumber: phoneNumber                       
        }                                                  
    });                                                    
    ************************** RELEVANT CODE TO ISSUE *************************
    if (userProfile) {
        const message = "Your username is:\n" + userProfile.username;
        const sent = await AWSSNSClient.sendMessage(message, phoneNumber);

        if (!sent) {
            result.error = setTitleAndMessage("Error", "An error occurred");
        } else {
            result.success = setTitleAndMessage("Success", "Message sent"); 
        }
    }
    return res.send(result);
    ***************************************************************************
}

在我的其他类 AWSSNSClient 中,我有以下 sendMessage 函数:

function sendMessage(message, phoneNumber) {
    const params = { 
        Message: message, 
        MessageStructure: "string", 
        PhoneNumber: "+1" + phoneNumber
    };
    let sent = false;
    sns.publish(params, function(err, data) {
        if (err) {
            console.log(err, err.stack); // an error occurred
        }
        else {
            sent = true;
        }
    });

    return sent;
}

我无法弄清楚如何让 sendMessage 在返回自身之前等待 sns.publish 返回。我已尝试将其设为异步方法并在 sns.publish 上添加 await,但该函数仍会在 sent 设置为 true 之前返回。

我知道消息发送没有错误,因为我正在接收它们并且没有打印控制台日志。

最佳答案

通过 Google 偶然发现了这个问题,今天我自己想弄明白 - 我现在使用的简短答案:

You can now do this with Async/Await — and Call the AWS service (SNS for example) with a .promise() extension to tell aws-sdk to use the promise-ified version of that service function (SNS) instead of the call back based version.

这里唯一需要注意的是包含函数还必须是异步的才能使用 await 语法。

例如:

let snsResult = await sns.publish({
    Message: snsPayload,
    MessageStructure: 'json',
    TargetArn: endPointArn
}, async function (err, data) {
    if (err) {
        console.log("SNS Push Failed:");
        console.log(err.stack);
        return;
    }
    console.log('SNS push suceeded: ' + data);
    return data;
}).promise();

The important part is the .promise() on the end there. Full docs on using aws-sdk in an async / promise based manner can be found here: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html

为了运行另一个 aws-sdk 任务,您可以类似地向该函数添加 await 和 .promise() 扩展(假设可用)。

对于遇到这个线程并且实际上只是想简单地将多个 aws-sdk promise 推送到一个数组并等待整个数组完成(不考虑哪个 promise 先执行)的人,我最终得到了这样的结果:

let snsPromises = [] // declare array to hold promises
let snsResult = await sns.publish({
    Message: snsPayload,
    MessageStructure: 'json',
    TargetArn: endPointArn
}, async function (err, data) {
    if (err) {
        console.log("Search Push Failed:");
        console.log(err.stack);
        return;
    }
    console.log('Search push suceeded: ' + data);
    return data;
}).promise();

snsPromises.push(snsResult)
await Promise.all(snsPromises)

希望能帮助像我一样通过谷歌偶然发现这个的人!

关于javascript - 等待 AWS SNS 发布回调将值返回给调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47806294/

相关文章:

javascript - 前端连接MongoDB?

javascript - react : Get initialstate after state has changed

javascript - 如何在 puppeteer 中执行 __doPostBack 函数?

c# - 堆栈展开时嵌套异步方法中的堆栈溢出异常

javascript - 将js变量插入html href标签

node.js - 如何在 NODE.js 服务器上使用 Google 字体?

javascript - Node.js 捕获并重试 ECONNRESET

javascript - 为什么代码中的 catch 语句没有捕获 async 函数中的错误?

javascript - 在 Javascript 中,async await 是否等待所有嵌套函数完成?

javascript - 表单无法提交,未捕获类型错误 : Illegal invocation