Экспресс-роутер ждет условной функции перед отправкой ответа - PullRequest
0 голосов
/ 10 мая 2019

Я создаю приложение Express, используя Twilio, чтобы позволить группе людей общаться через SMS без необходимости устанавливать приложение или иметь дело с ограничениями на групповые тексты, которые, по-видимому, есть у некоторых телефонов / операторов.Он развернут через Azure, но я уверен, что преодолел трудности с настройкой.В качестве раннего теста, который я могу сделать эту работу и для некоторого вкуса, я пытаюсь настроить функцию, чтобы вы могли текст "шутка" (в идеале без учета регистра), и он будет отправлять случайную шутку от https://icanhazdadjoke.com/. Если что-то еще отправлено в текстовом сообщении, сейчас оно должно в основном отражать его обратно.

Я чувствую, что это связано с асинхронностью js и движением кода до возвращения GET, поэтому яЯ пытаюсь использовать обещания, чтобы заставить код ждать, но условная природа - это новая морщина для меня.Я искал ответы, но, похоже, ничего не работает.Я, по крайней мере, выделил проблему, так что рука не-шутки работает правильно.

Вот функция для получения шутки, файл console.log выводит правильно:

const rp = require('request-promise-native');
var options = {
    headers: {
        'Accept': 'application/json'
    }
}
function getJoke() {
    rp('https://icanhazdadjoke.com/', options) //add in headers
    .then(joke => {
        theJoke = JSON.parse(joke).joke
        console.log(theJoke)
        return theJoke
    });
}
}

Здесьэто часть моего роутера, которая работает не совсем правильно.Если я пишу что-то, что не является «шуткой», я получаю ответное эхо через SMS.Если я пишу «шутка», я не получаю ответное SMS, я вижу «undefined» в журнале Kudu (снизу), а затем я вижу журнал POST, а затем я вижу шутку из функциивыше, запустив.

smsRouter.route('/')
.post((req, res, next) => {
    const twiml = new MessagingResponse();
    function getMsgText(request) {
      return new Promise(function(resolve, reject) {
        if (req.body.Body.toLowerCase() == 'joke') {
          resolve(getJoke());
        }
        else {
          resolve('You texted: ' + req.body.Body);
        }
      })
    }
    getMsgText(req)
    .then(msg => {
      console.log(msg);
      twiml.message(msg);
      res.writeHead(200, {'Content-Type': 'text/xml'});
      res.end(twiml.toString());
    })
  })

Как я могу сделать так, чтобы getMsgText () ждал, пока вызов getJoke () полностью разрешится, прежде чем перейти к .then?

1 Ответ

0 голосов
/ 10 мая 2019

Я думаю, это то, что вы ищете. Обратите внимание, что я использовал async/await, а не цепочку обещаний.

// joke.get.js
const rp = require('request-promise-native');
var options = {
    headers: {
        'Accept': 'application/json'
    }
}
async function getJoke() {
    const data = await rp('https://icanhazdadjoke.com/', options) //add in headers
    return JSON.parse(data).joke;
}



// route.js
smsRouter.route('/')
.post(async (req, res, next) => {
    const twiml = new MessagingResponse();
    async function getMsgText(request) {
      if(req.body.Body.toLowerCase() === 'joke'){
        return await getJoke();
      }
      return `You texted: ${req.body.Body}`
    }

    const msg = await getMsgText(req);
    twiml.message(msg);
    res.status(200).send(twiml.toString());
  })

асинхронный / ожидающий в JS

...