如何在SvelteKit中使用yahoo-finance模块并解决util.inherits报错
问题原因
你遇到的报错是运行环境不兼容导致的。yahoo-finance 是专为 Node.js 环境设计的第三方库,依赖 Node.js 内置的 util、http 等核心模块,你直接在浏览器侧运行的前端 Svelte 组件中导入该库,浏览器环境并没有这些 Node.js 原生 API 的实现,自然会抛出 util.inherits is not a function 类的错误,和你使用 require 还是 import 语法无关。
解决方案
利用 SvelteKit 自带的服务端 API 路由能力,把调用 yahoo-finance 的逻辑放到服务端执行,前端只需要调用自己写的服务端接口获取数据即可。
步骤1:新建服务端API路由
在你的 SvelteKit 项目下创建文件 src/routes/api/yahoo-quote/+server.js,写入如下代码:
import YahooFinance from "yahoo-finance"; import { json } from '@sveltejs/kit'; export async function GET() { const result = await YahooFinance.quote({ symbol: 'AAPL', modules: [ 'price', 'summaryDetail' ] }); return json(result); }
如果需要支持自定义查询参数,你可以解析请求携带的参数,动态传入 YahooFinance.quote 方法中。
步骤2:修改前端组件代码
删掉前端组件中直接导入 yahoo-finance 的逻辑,改为调用刚创建的服务端接口:
<script> let text = ""; const testQuote = async () => { const res = await fetch('/api/yahoo-quote'); const result = await res.json(); text = JSON.stringify(result, null, 2); } </script> <button on:click={testQuote}>发起请求</button> <p>{text}</p>
这样所有调用 yahoo-finance 的逻辑都会在 SvelteKit 的 Node.js 服务端执行,不会触发浏览器环境缺少 Node.js 核心模块的报错。
内容的提问来源于stack exchange,提问作者Alex Davies
相关产品推荐
相关产品推荐

