JS/TS CLI转Chrome扩展报Uncaught (in promise) TypeError: adapter is not a function
错误原因及解决方案
根因
你使用的trading-view-recommends-parser-nodejs是Node.js环境专用库,底层依赖Axios发送网络请求,库内置默认绑定了Node.js专属的http/https模块作为请求适配器。Chrome扩展运行在浏览器环境,没有Node.js内置核心模块,所以库调用时找不到对应的adapter函数抛出错误。
可行解决方案
方案1:替换兼容浏览器的实现
直接放弃Node.js专用的该依赖,自己封装TradingView公开接口请求逻辑,Chrome扩展环境直接用原生fetch发送请求、解析返回结果即可,无需额外依赖,同时可以规避跨域、适配等问题。方案2:手动配置Axios浏览器适配器
如果必须保留该依赖,可手动给Axios配置适配浏览器环境的请求适配器:- 安装适配fetch的Axios适配器:
npm i @vespaiach/axios-fetch-adapter - 在初始化
TradingViewScan实例前添加全局配置代码:
import axios from 'axios' import fetchAdapter from '@vespaiach/axios-fetch-adapter' axios.defaults.adapter = fetchAdapter该方案适配Chrome扩展Manifest V3的service worker环境,因为Manifest V3的后台运行环境仅支持fetch,不支持XMLHttpRequest。
- 安装适配fetch的Axios适配器:
方案3:后端中转请求
将TradingView接口请求逻辑迁移到自己的后端服务,Chrome扩展仅调用后端封装好的接口,既可以规避浏览器环境的库适配问题,也可以解决TradingView接口的跨域限制。
额外注意事项
- 若使用Manifest V3,需要在
manifest.json的host_permissions字段中添加TradingView相关域名的访问权限,否则请求会被浏览器拦截。 - 不要在content script中直接发送跨域请求,统一放到background service worker中处理,避免跨域报错。
内容的提问来源于stack exchange,提问作者user3267887
相关产品推荐
相关产品推荐

