Я создаю чат-бота Dialogflow, который использует облачную функцию Google в качестве webhook, с node.js и request-обещание-native и без использования Firebase или Google Actions.Мой webhook отлично работает для извлечения и возврата данных, которые я хочу, из внешнего API (Promise разрешен), но теперь у меня возникают проблемы при попытке обработать ошибки кода с помощью Promise reject.
Вот фрагмент кода, показывающий, что япытаюсь сделать.С намеренно неправильным URL-адресом код переходит к блоку .catch, даже не переходя к параметру отклонения Promise, и в журнале облачной функции отображается сообщение об ошибке «Необработанный отказ».
function searchMyData(agent) {
return new Promise((resolve, reject) => {
var myUrl = 'deliberately wrong to trigger rejection';
// Make the HTTP request with request-promise-native
// https://www.npmjs.com/package/request-promise
var options = {
uri: myUrl,
headers: {
'User-Agent': 'Request-Promise-Native'
},
json: true
};
rpn(options)
.then((json) => {
if(json) {
// Whole bunch of code for getting the desired data
// and resolving the Promise
// This part works
var result = agent.add('Here is your data');
resolve(result); // Promise resolved
}
else { // This block is not run, why?
// Reject Promise and return error message to Dialogflow
console.log('Promise rejected');
var rejectMessage = 'Sorry, an error occurred.';
agent.add(rejectMessage);
reject(rejectMessage);
}
}) // .then end
.catch((err) => {
console.log('In .catch block'); // This is run
throw new Error('err.message from .catch: '+ err.message); // This is run
}); // .catch end
}); // Promise end
} // searchMyData end
Мне неясно, каккак структурировать код, чтобы он запускал отклонение Promise при возникновении ошибки.Структура, использованная здесь, - это то, что я видел в уроках, с Обещанием, разрешенным в блоке if и отклоненным в блоке else, все в пределах .then, за которым следует .catch.Но мой код никогда не достигает блока else.
Или, в качестве альтернативы, возможно ли вообще исключить опцию «Отклонено обещание», или это создаст скрытые проблемы где-нибудь в будущем?Все, что я действительно хочу сделать в случае, если webhook не работает, это вернуть сообщение об ошибке пользователю в Dialogflow (и зарегистрировать ошибку внутри).