NodeJS调用Google Cloud异步接口无法捕获错误该如何处理
问题原因
你所使用的@google-cloud/monitoring库的listTimeSeries方法存在不符合JS异步开发规范的实现:该方法在参数校验、身份认证初始化等前置阶段就直接同步抛出错误,还未进入异步逻辑返回Promise实例,所以await对应的try/catch、Promise链式.catch()这些针对异步错误的捕获机制都无法生效。
解决方案
要同时覆盖同步抛错和异步抛错两种场景,你可以采用双层捕获的写法,示例代码如下:
// 导入依赖、初始化客户端逻辑保持不变 const monitoring = require('@google-cloud/monitoring'); const client = new monitoring.MetricServiceClient(); const projectId = 'XXXXXXXXX'; async function getMetrics() { // 外层catch同时捕获同步、异步错误 try { const request = { name: client.projectPath(projectId), filter: 'metric.type="cloudsql.googleapis.com/database/cpu/utilization"', interval: { startTime: { seconds: Date.now() / 1000 - 60 * 1, }, endTime: { seconds: Date.now() / 1000, }, }, view: 'HEADERS', }; console.log('start'); // 先调用方法,捕获可能的同步抛错 let listPromise; try { listPromise = client.listTimeSeries(request); } catch (syncErr) { throw new Error(`同步调用错误:${syncErr.message}`); } // 等待Promise返回,捕获异步错误 const [timeSeries] = await listPromise; console.log('Found data points for the following instances:'); timeSeries.forEach(data => { console.log(data.metric.labels.instance_name); }); } catch (err) { // 所有错误统一在这里处理 console.error('拉取指标失败:', err); } } // 顶层调用追加catch,防止遗漏全局未捕获的Promise rejection getMetrics().catch(globalErr => { console.error('全局未捕获错误:', globalErr); });
额外说明
你也可以向Google Cloud SDK官方仓库反馈这个不符合异步规范的实现问题,推动官方后续版本修复该异常行为。
内容的提问来源于stack exchange,提问作者Hike Nalbandyan
相关产品推荐
相关产品推荐

