Express路由器在发送响应之前等待条件功能

时间:2019-05-09 21:55:40

标签: node.js express twilio-api

我正在使用Twilio构建Express应用程序,以允许一群人通过SMS进行通讯,而不必安装应用程序或处理某些电话/运营商似乎对群组文本的限制。它是通过Azure部署的,但是我可以肯定地说我已经摆脱了配置难题。作为我可以进行这项工作且有点味道的早期测试,我试图设置一个功能,以便您可以向“笑话”发送文本(理想情况下,不区分大小写),并且它将从{{3} }。如果发短信,目前基本上应该将其回显。

我感觉这与js异步和GET返回之前代码继续运行有关,所以我试图使用promises来等待代码,但是条件性对于我。我一直在寻找答案,但似乎没有任何效果。我至少已经解决了这个问题,所以非笑话手臂可以正常工作。

这里是检索笑话的功能,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
    });
}
}

这是我路由器的一部分无法正常工作。如果我发的不是“笑话”的文字,我会通过短信回显。如果我发“笑话”短信,我没有收到回复短信,我在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 :(得分:0)

我认为这就是您要寻找的。 请注意,我使用的是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());
  })

async/await in JS