Выполнить запрос перед отправкой сообщения - PullRequest
0 голосов
/ 14 февраля 2019

Я делаю бот Messenger в NodeJS.Я хочу, чтобы пользователи могли запрашивать все свои поезда.Проблема в том, что мы хотим выполнить запрос до того, как NodeJS отправит сообщение пользователю.

Я искал асинхронные функции

function handlePostback(sender_psid, received_postback) {
let response;

// Get the payload for the postback
let payload = received_postback.payload;

// Set the response based on the postback payload
switch(payload){
    case "yes" : 
    let data = null
    axios.get('http://api.irail.be/connections/?from=Mechelen&to=Puurs&date=010219&time=1650&timesel=departure&format=json&lang=en&fast=false&typeOfTransport=trains&alerts=false&resul1=1')
    .then(function (response) {
    // handle success
    data = data.response;
 })
response = {
        "text": data.connections.arrival.name
    }
   break;
 }
  callSendAPI(sender_psid, response);
}
function callSendAPI(sender_psid, response) {
// Construct the message body
let request_body = {
    "recipient": {
        "id": sender_psid
    },
    "message": response
}
// Send the HTTP request to the Messenger Platform
request({
    "uri": "https://graph.facebook.com/v2.6/me/messages",
    "qs": { "access_token": PAGE_ACCESS_TOKEN },
    "method": "POST",
    "json": request_body
}, (err, res, body) => {
    if (!err) {
        console.log('message sent!')
    } else {
        console.error("Unable to send message:" + err);
    }
});
}

Итак, как вы видите, скрипт уже отправляетсообщение пользователю в Messenger перед выполнением запроса.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

В вашем коде есть некоторые ненужные переменные и проблемы (например, data = data.response должно быть data = response.data), это будет современная версия с функциями async / await и стрелками.В этом случае вам не нужна функция обратного вызова, callSendAPI будет вызываться после запроса AJAX.Я также удалил switch, потому что достаточно простого if:

const handlePostback = async (sender_psid, received_postback) => {
    // Get the payload for the postback
    const payload = received_postback.payload;

    // Set the response based on the postback payload
    if (payload === 'yes') {
        try {
            const response = await axios.get('http://api.irail.be/connections/?from=Mechelen&to=Puurs&date=010219&time=1650&timesel=departure&format=json&lang=en&fast=false&typeOfTransport=trains&alerts=false&resul1=1');
            callSendAPI(sender_psid, {
                'text': response.data.connections.arrival.name
            });
        } catch (err) {
            console.log(err);
        }
    }
};

. Примечание: я бы не стал использовать 2 различных способа выполнения http-запросов, если вы тоже используете суперагент?Потому что http.request было бы возможно с Node.js, но request выглядит как суперагент;)

0 голосов
/ 14 февраля 2019

Поместите callSendAPI() в ваш обратный вызов Axios

function handlePostback(sender_psid, received_postback) {

let response;

// Get the payload for the postback
let payload = received_postback.payload;

// Set the response based on the postback payload
switch (payload) {
    case "yes":
        let data = null
        axios.get('http://api.irail.be/connections/?from=Mechelen&to=Puurs&date=010219&time=1650&timesel=departure&format=json&lang=en&fast=false&typeOfTransport=trains&alerts=false&resul1=1')
            .then(function(response) {
                // handle success
                data = data.response;
            })
        response = {
            "text": data.connections.arrival.name
        }
            callSendAPI(sender_psid, response);

        break;
 }
}
...