Javascript 如何在用作Dialogflow webhook的Google云函数中实现承诺拒绝选项?

Javascript 如何在用作Dialogflow webhook的Google云函数中实现承诺拒绝选项?,javascript,node.js,google-cloud-functions,dialogflow-es,request-promise,Javascript,Node.js,Google Cloud Functions,Dialogflow Es,Request Promise,我正在构建一个Dialogflow聊天机器人,它使用Google云函数作为webhook,node.js和request promise为本机,而不使用Firebase或Google操作。我的webhook可以很好地从外部API Promise中获取和返回我想要的数据,但现在我在尝试用Promise reject编写错误处理代码时遇到了问题 下面是一段代码,显示了我要做的事情。对于故意错误的URL,代码跳转到.catch块,而不转到Promise reject选项,云函数日志显示错误消息Unha

我正在构建一个Dialogflow聊天机器人,它使用Google云函数作为webhook,node.js和request promise为本机,而不使用Firebase或Google操作。我的webhook可以很好地从外部API Promise中获取和返回我想要的数据,但现在我在尝试用Promise reject编写错误处理代码时遇到了问题

下面是一段代码,显示了我要做的事情。对于故意错误的URL,代码跳转到.catch块,而不转到Promise reject选项,云函数日志显示错误消息Unhandled rejection

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
我不清楚如何构造代码,使其在出现错误时运行承诺拒绝。这里使用的结构是我在教程中看到的,承诺在if块中解析,在else块中拒绝,都在.then中,后面跟着.catch。但我的代码从未到达else块


或者,有没有可能完全忽略拒绝承诺的选项,或者它会在将来的某个地方产生隐藏的问题?如果webhook不起作用,我真正想做的就是在Dialogflow中向用户返回一条错误消息,并在内部记录错误。

阅读承诺。拒绝的承诺作为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

谢谢这可用于清除日志中未捕获的错误消息。我仍然没有将rejectMessage传递给Dialogflow,但仔细检查,这似乎是由于webhook响应的固定请求超时5秒造成的。我必须找到一些解决方法,但至少现在我没有未捕获的错误。为了跟进,我制作了一个虚拟版本的代码,以避免外部API webhook超时,这可能会掩盖任何实际问题。我仍然在日志中得到一个未处理的拒绝错误,尽管上面的示例已经消除了未捕获的异常。我现在的问题是,未经处理的拒绝是否值得担心,我应该怎么做?我试图通过生成一个错误来处理拒绝:rejectError'Promise rejected';但显然这还不够。如果你遇到了一个错误,你需要用一个catch块来捕捉它。承诺工作得很好,但错误处理最好使用try-catch和async-await。您可以将您的承诺包装在try-catch块中,因此错误将始终在catch块中处理。再次感谢!我确实有一个catch块,如示例代码中所示,但是看起来仅仅抛出一个错误是不起作用的。我还必须研究async/await。在实际的webhook中,如果我尝试模拟一个错误情况,webhook请求只是在记录任何其他错误消息之前超时。我总是可以通过Dialogflow自己的控制台向用户提供一条错误消息,但这似乎仍然会在某个地方留下一个未解决和未拒绝的承诺。虽然谷歌云功能可能会在幕后处理这些问题?你的catch块会捕捉到来自rpn的错误。但您必须在返回承诺的某个位置调用searchMyData。当searchMyData的此承诺被拒绝时,您将无法处理它。这就是为什么您会看到未处理的拒绝错误。通常,必须在调用堆栈中最底层的函数上使用catch块。这将始终捕获最上面的错误,并且您的程序将不会面临任何崩溃或警告。