Javascript 如何在用作Dialogflow webhook的Google云函数中实现承诺拒绝选项?
我正在构建一个Dialogflow聊天机器人,它使用Google云函数作为webhook,node.js和request promise为本机,而不使用Firebase或Google操作。我的webhook可以很好地从外部API Promise中获取和返回我想要的数据,但现在我在尝试用Promise reject编写错误处理代码时遇到了问题 下面是一段代码,显示了我要做的事情。对于故意错误的URL,代码跳转到.catch块,而不转到Promise reject选项,云函数日志显示错误消息Unhandled rejectionJavascript 如何在用作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
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块。这将始终捕获最上面的错误,并且您的程序将不会面临任何崩溃或警告。