Как связаться с опцией «Отклонить обещание» в облачной функции Google, используемой в качестве веб-крючка Dialogflow? - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю чат-бота 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 (и зарегистрировать ошибку внутри).

1 Ответ

1 голос
/ 10 апреля 2019

Читайте об обещаниях. Отклоненные обещания возвращаются в качестве второго параметра в блоке then.

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
            }
}, error => { // This block will be run on promise rejection

                console.log('Promise rejected');
                var rejectMessage = 'Sorry, an error occurred.';
                agent.add(rejectMessage);
                reject(rejectMessage);
            }
        }) // .then end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...