Express 路由器在发送响应之前等待条件函数
Express router wait for conditional function before sending the response
我正在使用 Twilio 构建一个 Express 应用程序,以允许一群人通过 SMS 进行通信,而无需安装应用程序或处理某些 phones/carriers 似乎具有的群组文本限制。它是通过 Azure 部署的,但我有理由相信我已经克服了配置难题。作为一个早期测试,我可以让这个工作变得有点味道,我正在尝试设置一个功能,这样你就可以发短信 "joke" (最好不区分大小写),它会从 [= 发送一个随机笑话12=]。如果还有其他短信,现在基本上应该会回复。
我觉得这与 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
});
}
}
这是我的路由器中运行不正常的部分。如果我发的短信不是 "joke",我会通过短信收到回复。如果我发短信 "joke",我没有收到回复短信,我在 Kudu 日志中看到 "undefined"(从下面),然后我看到 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?
我想这就是您要找的。
请注意,我使用的是 async/await
而不是 promise 链接。
// 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());
})
我正在使用 Twilio 构建一个 Express 应用程序,以允许一群人通过 SMS 进行通信,而无需安装应用程序或处理某些 phones/carriers 似乎具有的群组文本限制。它是通过 Azure 部署的,但我有理由相信我已经克服了配置难题。作为一个早期测试,我可以让这个工作变得有点味道,我正在尝试设置一个功能,这样你就可以发短信 "joke" (最好不区分大小写),它会从 [= 发送一个随机笑话12=]。如果还有其他短信,现在基本上应该会回复。
我觉得这与 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
});
}
}
这是我的路由器中运行不正常的部分。如果我发的短信不是 "joke",我会通过短信收到回复。如果我发短信 "joke",我没有收到回复短信,我在 Kudu 日志中看到 "undefined"(从下面),然后我看到 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?
我想这就是您要找的。
请注意,我使用的是 async/await
而不是 promise 链接。
// 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());
})