2017-03-09 5 views
1

이 주제와 관련하여 많은 의견을 찾았지만 실제로는 그렇지 않습니다. 나는 페이스 북 봇을 만들고있다. 지금 말하면 나는 단지 텍스트를 호출자에게 되풀이하기를 원한다. ec2를 사용하여이 작업 예제가 있습니다. 람다로 이동할 때, 그것은 작동하지 않습니다. 여기 내 코드입니다 : 나는 '테스트'버튼을 누르면 경우람다 핸들러에서 요청 약속을 사용하면 통화를 포기합니다.

exports.handler = (event, context, callback) => { 
... 
} else if (event.httpMethod == 'POST') { 
    var data = JSON.parse(event.body); 
    if (data.object == 'page') { 
     data.entry.forEach(function(pageEntry) { 
      // Iterate over each messaging event 
      pageEntry.messaging.forEach(function(messagingEvent) { 
       if (messagingEvent.message) { 
        receivedMessage(messagingEvent); 
       } 
      }); 
     }); 
    } 
    //if I only use callback like the documentation states, gateway always says 502, regardless of the message content in second param, or even using no params 
    //callback(null, JSON.stringify({"statusCode": 200, "headers": {"content-type":"application.json"}, "body": ""})); 
    //if i answer using succeed, gateway says 200 ok, bot never gets post 
    context.succeed({"statusCode": 200, "headers": {"content-type":"application.json"}, "body": ""}); 
} 

function receivedMessage(event) { 
var senderID = event.sender.id; 
var messageText = message.text; 
if (messageText) { 
    var messageData = { 
     recipient: { 
      id: senderID 
     }, 
     message: { 
      text: messageText, 
      metadata: "DEVELOPER_DEFINED_METADATA" 
     } 
     }; 
    callSendAPI(messageData); 
} 

}

function callSendAPI(messageData) { 
request({ 
    uri: 'https://graph.facebook.com/v2.8/me/messages', 
    qs: { access_token: PAGE_ACCESS_TOKEN }, 
    method: 'POST', 
    json: messageData 
}).then(function(body) { 
    console.log('success'); 
}).catch(function(err) { 
    console.error("Failed calling Send API", err); 
}); 

}

나는 그 때는 부분적으로 context.succeed를 이동하려고

하지만, 게이트웨이 (502)를 얻을 수 aws 람다 콘솔에서 메신저가 메시지를받습니다. 그것은 약속과 함께 존재하는 것으로 보이지만 그것은 촉발되지 않습니다.

주제에 대한 많은 게시물을 읽고 많은 답변을 시도했지만 성공하지 못했습니다. 나는 다른 사람들이 claudiajs를 사용하여 같은 이슈를 가졌음을 알았으며, 클라우디아 약속이 있건 없건간에.

지금은 ec2로 다시 이동하는 것이 좋습니다. 어떤 도움을 주셔서 감사합니다.

답변

0

이 문서는 상황이 API 게이트웨이 람다 프록시의 경우에 설정해야한다고 : https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format

내가 가지고 있던 문제가 오류에있다 포획에, 나는 문맥을 부르지 않고 있었다. 불행은 502의 나쁜 출입구에서 끝나고 외침은 후에 받아지지 않을 것입니다. 모든 경로에는 컨텍스트가 설정되어 있어야합니다.

0

callback(...)context.succeed(...)을 사용하는 것의 차이는 context.succeed(...)입니다. 호출하면 람다가 빈 이벤트 루프를 기다립니다. 자세한 내용은 다음 링크를 참조하십시오. http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

코드 예에서 callback(...)을 호출 할 때 이벤트 루프에 receivedMessage 및 callSendAPI의 이벤트가 있습니다. 코드는 결과 약속을 연결하지 않고 완료하기 위해 '대기'합니다. callback(...)을 호출하기 전에 또한 두 가지 방법 각각에서 응답을 작성하고 콜백을 호출 할 수 있습니다.

receivedMessage & callSendAPI에서 약속을 반환하고 모든 메시지가 처리 된 후에 콜백을 호출하는 것이 좋습니다.

이런 식으로 뭔가를 작동 할 수 있습니다 :

/* This goes inside your handler */ 
//using Bluebird promises 
Promise.all(Promise.map(data.entry, pageEntry => { 
    // Iterate over each messaging event 
    return Promise.all(
      pageEntry.messaging 
        .filter(e => e.message) 
        .map(messagingEvent => 
        receivedMessage(messagingEvent))); 
})).then(res => callback(null, res)) 
    .catch(err => callback(err)); 
/* The code above goes in your handler */ 

function receivedMessage(event) { 
    var senderID = event.sender.id; 
    var messageText = message.text; 
    if (messageText) { 
     var messageData = { 
       recipient: { 
        id: senderID 
       }, 
       message: { 
        text: messageText, 
        metadata: "DEVELOPER_DEFINED_METADATA" 
       } 
       }; 
     return callSendAPI(messageData); 
    } else { 
     return Promise.resolve({}); 
    } 
} 

function callSendAPI(messageData) { 
     return request({ 
       uri: 'https://graph.facebook.com/v2.8/me/messages', 
       qs: { access_token: PAGE_ACCESS_TOKEN }, 
       method: 'POST', 
       json: messageData 
      }); 
} 
+0

이 설명서에서는 컨텍스트를 설정해야한다고 설명합니다. https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple- proxy-for-lambda-output-format –

+0

API 게이트웨이와의 통합을 위해'context.succeed (...)'결과는 지정된 JSON 형식이어야합니다. 필자가 제공 한 예제 코드에서는'callback (null, res)'보다는 "context.succeed (JSON.stringify ({statusCode : 200, body : res}))"가 될 것이다. –

+0

람다 만 사용하는 경우에도 콜백 솔루션을 원본 코드와 동일한 결과로 사용할 수 있습니다. –