2017-12-14 2 views
2

사용자가 비밀번호 재설정을 요청하면 문자 메시지를 보내려고합니다. 성공했는지 여부를 사용자에게 알리기 위해 메시지가 전송되기를 기다리고 싶습니다. 저는 현재 다음과 같이 그것을 시도하고있다 :AWS SNS 게시 콜백 호출 메소드에 값을 반환 할 때까지 기다립니다.

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; 
} 

내가 sns.publish에 대한 sendMessage 첨부 대기를 만드는 방법을 알아낼 수 없습니다 :

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 첨부 기능이 반환하기 전에 반환합니다. 내가 비동기 메서드를 만들고 sns.publish 기다리고 추가했지만 여전히 함수를 보낸 전에 true로 설정되면 가져옵니다.

메시지를 수신하고 콘솔 로그가 인쇄되지 않아서 메시지가 오류없이 전송된다는 것을 알고 있습니다.

+2

같은 callback를 제공 할 수 있습니다이

function sendMessage(message, phoneNumber, cb) { const params = { Message: message, MessageStructure: "string", PhoneNumber: "+1" + phoneNumber }; sns.publish(params, cb); } 

처럼 sendMessge을 수정, 당신은 어떤을 호출 할 수 있습니다 sendMessage 첨부에 콜백 함수를 제공해야 하나 성공 또는 오류가 발생하면이를 해결하거나 거부하는 약속을 반환합니다. –

답변

2

간단히 콜백을 사용할 수 있습니다. 다음 기본 파일에 자바 스크립트에서 다른 비동기 것들과 마찬가지로이

if (userProfile) { 
    const message = "Your username is:\n" + userProfile.username; 
    AWSSNSClient.sendMessage(message, phoneNumber, (err, data) => { 
    if (err) { 
     result.error = setTitleAndMessage("Error", "An error occurred"); 
    } 
    else { 
     result.success = setTitleAndMessage("Success", "Message sent"); 
    } 
    res.send(result); 
    }); 
} 
+0

sendMessage 함수에서 "let sent = false;"줄이 표시됩니다. 더 이상 정확할 필요가 없습니다. – havak5

+0

예, 더 이상 사용되지 않으므로 해당 변수를 제거 할 수 있습니다. –

+0

답을 수정하고'sent' 변수를 삭제했습니다. –

관련 문제