我正在Twilio内的一个项目中工作,使用Twilio Functions,在那里我试图设置SMS消息,以便如果我们收到一个传入的关键字,我们响应一个特定的消息,包括一个URL。该计划是有多个传入关键字,不同的响应,所以如果有人发送短信到我们的一个号码,根据关键字,我们与一个基本的消息和URL响应。我正试图找出最好的方法来处理这个在Twilio函数。
我让它为单个传入关键字/响应工作,如下所示。
if (incomingMessage.includes('testpark')) {
twiml.message('StartMyParking:nnTo start your parking, please click this link: https://blahblah.com');
} else if (incomingMessage.includes('bye')) {
twiml.message('Goodbye!');
} else {
twiml.message('Please check your zone/code and try again.');
}
虽然这样做是有效的,但我想添加更多传入的单词,以及响应,例如'testpark2'的传入消息和'StartMyParking:nn '的响应'StartMyParking:nn要开始停车,请点击此链接:https://blahblah2.com'。
然后我想包括另一个'testpark3'和'StartMyParking:nn '的响应'StartMyParking:nn开始你的停车,请点击此链接:https://blahblah3.com'等等,都在同一脚本中。
有人能帮我理解如何实现这一点吗?
有很多方法可以达到你想要的结果,但这里是最直接的开始。
您可以使用JavaScriptMap
预先定义关键字/响应对,而不是为每个可能的关键字创建else if
语句。Map
的键将是您的关键字,Map
的值将是您的响应:
const keywordResponseMap = new Map([
['testpark2', 'StartMyParking:nnTo start your parking, please click this link: https://blahblah2.com'],
['testpark3', 'StartMyParking:nnTo start your parking, please click this link: https://blahblah3.com'],
['testpark', 'StartMyParking:nnTo start your parking, please click this link: https://blahblah.com'],
]);
const keywords = Array.from(keywordResponseMap.keys());
let keyword;
if (incomingMessage.includes('bye')) {
twiml.message('Goodbye!');
}
else if (keyword = keywords.find(k => incomingMessage.includes(k))) {
const response = keywordResponseMap.get(keyword);
twiml.message(response);
} else {
twiml.message('Please check your zone/code and try again.');
}
还请注意,我将bye
放在前面,因为它比在incomingMessage
中查找关键字性能更高,因此当用户输入bye
时,您可以避免不必要的处理。
您可以使用find
搜索incomingMessage
中的任何关键字,然后您可以使用找到的keyword
从映射中检索response
。
如果你的响应总是相同的,除了URL,你可以进一步优化,只存储URL在映射和使用字符串插值,像这样:
const keywordUrlMap = new Map([
['testpark2', 'https://blahblah2.com'],
['testpark3', 'https://blahblah3.com'],
['testpark', 'https://blahblah.com'],
]);
const keywords = Array.from(keywordUrlMap.keys());
let keyword;
if (incomingMessage.includes('bye')) {
twiml.message('Goodbye!');
}
else if (keyword = keywords.find(k => incomingMessage.includes(k))) {
const url = keywordUrlMap.get(keyword);
twiml.message(`StartMyParking:nnTo start your parking, please click this link: ${url}`);
} else {
twiml.message('Please check your zone/code and try again.');
}
同样重要的是要注意,我将testpark
放在地图的最后,因为testpark
与testpark2
和testpark3
匹配。如果把它放在前面,即使用户提交testpark2
或类似的值,它也总是解析为testpark
。另外,我使用Map
类型是因为它保证键返回的顺序,这对于前一点也很重要。
当你有更多的关键字和响应时,你可能不得不开始寻找一种解决方案,将它们像数据库一样存储在外部,并通过关键字查询数据库来解析响应。
祝你好运,我们迫不及待地想看到你的作品!