5

ユーザーがパスワードのリセットを要求したときに、テキスト メッセージを送信しようとしています。成功したかどうかをユーザーに警告するメッセージが送信されるのを待ちたいと思います。私は現在、次のようにしようとしています:

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 を追加しようとしましたが、関数は send が true に設定される前に戻ります。

メッセージを受信して​​おり、コンソール ログが出力されていないため、メッセージがエラーなしで送信されていることがわかっています。

4

6 に答える 6

8

stackdave は実際に待機しますか?

Necevil コールバックを渡し、プロミスを使用して呼び出し操作を混在させているため、「成功した検索プッシュは 2 回ログに記録されます」。結果を取得する方法は 1 つだけにしてください。

let snsResult = await sns.publish({
    Message: snsPayload,
    MessageStructure: 'json',
    TargetArn: endPointArn}).promise()

トリックを行います

于 2019-01-23T11:49:46.790 に答える