本文将带大家用 Bun + TypeScript + Axios 搭建一套极简、规范、可直接落地的 LLM 接口请求方案。全程零复杂配置,完美解决传统 Node 开发的各类弊端,新手零基础也能一键复刻运行。
一、Bun vs 传统 Node.js 核心对比
在正式实战前,我们先通过直观对比,搞懂为什么现在越来越多开发者选择 Bun 替代传统 Node.js 做开发,其现代化开发优势一目了然:
| 开发场景 | 传统 Node.js | Bun |
|---|---|---|
| TS 运行方式 | 需手动配置 tsconfig、ts-node、Babel | 原生零配置,直接运行 TS 文件 |
| 依赖安装体验 | npm 安装缓慢,易出现版本锁报错 | 极速安装,完美兼容所有 npm 包 |
| 项目启动性能 | 冷启动耗时久,运行效率低 | 毫秒级启动,运行性能大幅提升 |
| 内置工具链 | 需单独安装打包、测试等工具 | 内置全套开发工具,开箱即用 |
二、Bun 核心优势(为什么选它?)
Bun 是基于 Zig 语言开发的高性能 JS/TS 运行时,作为 Node.js 的现代化升级版,核心优势集中在「快、简、全」三大特点,是目前前后端一体化开发的优质选择:
- 零配置支持 TS/JSX:无需配置 tsconfig、ts-node、Babel,原生识别 TypeScript 语法,开箱即用
- 极致运行性能:依赖安装、项目冷启动、接口请求响应速度全面超越 Node.js + npm
- 一体化集成工具链:内置包管理器、打包器、测试运行器,无需额外安装配套工具
- 完整兼容 Node 生态:支持 axios、dotenv 等所有主流 npm 依赖,项目迁移零成本
核心一句话概括:Bun 是一款更快、更省事、零配置的现代化 Node.js 替代运行环境。
三、前置基础:TS 类型转换核心知识点(避坑必看)
在进行 Bun + TS 项目开发、接口参数处理前,必须掌握 JS/TS 最经典的隐式类型转换易错坑。这是新手最容易踩的 bug,也是接口参数解析、数据运算的核心基础。
1. 易错演示原始代码
下面代码包含 JS 经典大坑:数字与字符串混合运算、多种类型转换写法、函数返回值缺失问题:
typescript
// 数值求和函数,限定参数为数字类型
function add(a: number, b: number) {
// return a + b; // 关键:注释掉后无返回值,默认返回 undefined
}
let a = 1; // 数字类型
let b = "2"; // 字符串类型
// 三种字符串转数字的常用写法
add(a, parseInt(b)); // 原生API转换:转整数
add(a, Number(b)); // 强制类型转换:标准整体转数字
add(a, +b); // 隐式类型转换:最简简写
console.log(add(a, Number(b)));
let c:number = add(a, Number(b));
2. 代码核心报错 & 坑点解析
坑点1:函数无 return,返回 undefined
函数内注释了 return a + b,TS 函数默认返回 undefined。最后一行将 undefined 赋值给 number 类型变量 c,会直接报类型不匹配错误,程序无法运行。
坑点2:JS 经典运算bug:+ 号双重作用
JS/TS 中 + 有两种逻辑:数字相加、字符串拼接。如果不做类型转换,直接执行 1 + "2",不会得到数学结果 3,而是拼接结果字符串 "12",这是开发高频隐形 bug。
3. 三种标准类型转换方式(企业常用)
- parseInt() :原生内置方法,专门提取字符串中的整数,适合纯数字字符串
- Number() :标准强制类型转换,完整转换数据格式,接口参数解析首选,兼容性最好
- +b 隐式转换:最简简写写法,代码简洁,日常开发高频使用
4. 修正后完整可运行代码
typescript
// 补全return,返回数字运算结果
function add(a: number, b: number) {
return a + b;
}
let a = 1;
let b = "2";
// 三种合法转换,结果一致
add(a, parseInt(b));
add(a, Number(b));
add(a, +b);
// 输出结果:3
console.log(add(a, Number(b)));
// 类型匹配,无报错
let c:number = add(a, Number(b));
5. 开发总结
所有接口参数、用户输入、文件读取的数据,默认大多为字符串类型,必须先转对应数据类型再运算。这也是后续 LLM 接口参数处理、数据格式化的核心基础。
四、项目实战:Bun+TS 调用 DeepSeek 大模型
本节以主流 DeepSeek 大模型接口为例,手把手实现完整的接口请求流程,包含依赖安装、环境变量配置、接口请求、异常捕获,完全贴合企业级开发规范。
1. 项目依赖安装
摒弃卡顿的 npm,直接使用 Bun 极速安装核心依赖,无需任何项目初始化配置:
csharp
# axios:企业级 HTTP 请求库
# dotenv:解析环境变量,保护敏感配置
bun add axios dotenv
2. 安全配置环境变量
开发核心规范:接口地址、API 密钥等敏感信息,禁止硬编码写入代码 。新建根目录 .env 文件,统一管理环境配置:
ini
# DeepSeek 大模型接口统一请求地址
DEEPSEEK_BASE_URL=https://api.deepseek.com/chat/completions
# 个人专属 API 密钥(替换为自己的密钥)
DEEPSEEK_API_KEY=你的DeepSeek_API_KEY
3. 完整可运行业务代码
新建 index.ts 文件,整合异步请求、标准 HTTP 接口格式、全局异常捕获,代码注释全覆盖,方便理解复用:
javascript
// 引入核心依赖
import axios from 'axios';
import dotenv from 'dotenv';
// 加载 .env 文件中的环境变量
dotenv.config();
/**
* 调用 DeepSeek 大模型对话接口
* 全局 try/catch 捕获所有网络异常,防止程序崩溃
*/
async function chat() {
try {
// 标准 LLM 接口 POST 请求
const res = await axios.post(
// 接口请求地址(从环境变量读取)
`${process.env.DEEPSEEK_BASE_URL}`,
// 请求体:大模型通用对话参数
{
model: 'deepseek-v4-flash',
messages: [{
role: 'user',
content: '你好,介绍一下Bun'
}]
},
// 请求头:配置数据格式、接口鉴权
{
headers: {
'Content-Type': "application/json",
Authorization: `Bearer ${process.env.DEEPSEEK_API_KEY}`
}
}
)
// 打印大模型返回的对话内容
console.log(res.data.choices[0].message.content);
} catch (err: any) {
// 捕获网络超时、密钥错误、额度不足、接口限流等所有异常
console.log('接口请求失败:', err.message);
}
}
// 执行接口请求函数
chat();
4. 项目启动运行
依托 Bun 零配置特性,无需编译、无需转换,一条命令直接运行 TS 文件:
bun index.ts
运行成功后,终端会直接输出大模型的回复内容,完整实现 LLM 接口调用!
五、开发核心规范与易错点避坑
1. LLM 接口必用 POST 的核心原因
所有大模型对话接口,统一采用 POST 请求,严禁使用 GET 请求,核心原因有三点:
- 安全性更高:GET 请求参数拼接在 URL 中,密钥、对话内容明文暴露,存在严重泄露风险;POST 请求参数存于请求体,更安全
- 无数据长度限制:GET 存在 URL 长度上限,无法传输多轮对话上下文、大文本、图片等数据
- 符合行业规范:所有带鉴权、带复杂业务参数的接口,均统一使用 POST 请求方式
2. 标准 HTTP 接口请求三要素
企业级接口请求必须包含完整三要素,缺一不可,也是面试、项目开发核心考点:
- 请求地址 + 请求方式:定位接口服务,定义数据提交方式
- 请求头 Headers:配置数据格式、存放 APIKey/Token 等鉴权信息
- 请求体 Body:传递核心业务参数(模型类型、对话内容等)
3. 网络请求必须加 try/catch
网络请求属于不稳定操作,大模型接口极易出现各类异常:网络超时、API 密钥错误、账号额度耗尽、接口限流、服务器繁忙等。若无 try/catch 捕获异常,会直接导致程序闪退崩溃,所有网络请求添加异常捕获是开发硬性规范。
4. JS/TS 高频易错点汇总
- 异步请求必须搭配await,否则仅获取 Promise 对象,无法拿到真实接口数据
- 敏感信息严禁硬编码,统一通过 dotenv 读取环境变量,保障数据安全
- 严格遵循 TS 类型约束,规避隐式类型转换导致的逻辑 bug
- 环境变量拼接需规范写法,避免接口地址失效