TypeScript中Google Maps API地理编码函数的RefererNotAllowedMapError无法触发捕获的问题
TypeScript中Google Maps API地理编码函数的RefererNotAllowedMapError无法触发捕获的问题
兄弟,我太懂你这种抓不到错误的抓狂感了!你的代码里有几个关键问题导致RefererNotAllowedMapError一直没被正确捕获,我帮你一一拆解:
1. 冗余的Promise包装是大坑
你把this.geocoder.geocode()本身返回的Promise又套了一层new Promise,这属于典型的Promise反模式。这种操作不仅完全没必要,还会打乱Promise原本的错误传递逻辑,导致部分错误无法被你写的处理逻辑捕获。
2. 外层try/catch完全没用
你加的外层try/catch只能捕获同步代码抛出的错误,而geocode是异步操作,它的错误不会进入这个同步的try/catch块里,这部分代码纯纯是冗余的,删掉就行。
3. 错误判断逻辑不准确
Google Maps API抛出的RefererNotAllowedMapError有自己专属的错误名称,你不用绕弯子去判断error.name === 'Error'再匹配message,直接判断error.name === 'RefererNotAllowedMapError'就够了。而且有时候API的错误结构可能和你预期的不一样,建议先把错误对象完整打出来看看细节。
修正后的代码
我帮你简化并调整了错误逻辑,去掉了冗余部分,应该能正确捕获目标错误了:
private getGeocoderResponsePromise(position: google.maps.LatLng): Promise<google.maps.GeocoderResponse> { // 直接返回geocode的Promise,不用额外包装 return this.geocoder.geocode({ location: position }) .catch((error) => { // 先把错误完整打出来,方便调试结构 console.dir(error); if (error?.name === 'RefererNotAllowedMapError') { console.log('Google Maps API error: RefererNotAllowedMapError'); // 抛出自定义错误给上层处理 throw new Error('RefererNotAllowedMapError: The referring URL is not allowed to access the Google Maps API.'); } else { // 重新抛出其他错误,不影响上层对其他错误的处理 throw error; } }); }
额外调试建议
- 先在
catch里用console.dir(error)打印完整的错误对象,确认它的name、message、status等字段的实际值,避免判断条件写错。 - 检查Google Maps API密钥的Referer白名单配置,有时候错误不触发是因为请求直接被API网关拦截,根本没走到你的错误处理逻辑里。
- 看浏览器的网络请求面板,查看地理编码请求的响应状态和响应体,确认错误的实际返回形式。
备注:内容来源于stack exchange,提问作者Yannick Desjardins
相关产品推荐
相关产品推荐

