引言:为什么需要在 Node.js 中使用 HTTP 客户端?
在现代 Web 开发中,不与外部服务交互几乎是不可能的。无论是向服务器发送数据、获取货币汇率、使用 REST API,还是与云平台集成——所有这些都需要能够发送 HTTP 请求。在 Node.js 环境中,有几种实现方式:从内置的 http 模块到流行的第三方库(如 axios)以及原生的 fetch。
在本文中,我们将详细讲解如何在 JavaScript(Node.js)中正确组织 HTTP 客户端,如何为不同任务选择合适的工具,以及如何避免常见错误。您将学习如何处理响应、管理异步操作,并编写清晰、易于维护的代码。
在 Node.js 中创建 HTTP 请求的主要方式
Node.js 为开发者提供了几种处理 HTTP 的方式。让我们看看三种主要方法:内置的 http 模块、axios 库以及原生的 fetch。
1. 内置的 http/https 模块
最低层级的方法。它给予您对请求的完全控制,但需要编写更多代码。适用于需要最小化依赖或处理非标准协议的场景。
使用 https 模块发送 GET 请求的示例:
const https = require('https');
function getUsers() { return new Promise((resolve, reject) => { https.get('https://jsonplaceholder.typicode.com/users', (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => resolve(JSON.parse(data))); }).on('error', reject); });}
getUsers().then(users => console.log(users[0].name));优点: 无外部依赖,完全控制。
缺点: 代码冗长,需要手动包装成 Promise,手动管理数据流。
2. axios 库
最流行的 HTTP 请求库。它既能在浏览器中运行,也能在 Node.js 中运行。支持 Promise、拦截器、自动 JSON 解析以及请求取消。
安装方式:
npm install axios使用 axios 发送 POST 请求的示例:
const axios = require('axios');
async function createPost() { try { const response = await axios.post('https://jsonplaceholder.typicode.com/posts', { title: 'HTTP Client in JavaScript', body: 'Making requests correctly', userId: 1 }); console.log('Post created:', response.data); } catch (error) { console.error('Error:', error.message); }}
createPost();优点: API 简单,自动处理 JSON,支持拦截器,可设置超时。
缺点: 需要安装,库体积较大(压缩后约 14 KB)。
3. 原生 fetch(Node.js 18+)
从 Node.js 18 版本开始,fetch 已内建为原生函数。这统一了浏览器和服务器端的代码。不过,旧版本的 Node.js 需要使用 polyfill。
使用 fetch 和 async/await 的示例:
async function getUser(id) { const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const user = await response.json(); return user;}
getUser(1).then(user => console.log(user.name));优点: 原生支持,无需安装,API 现代化。
缺点: 在 Node.js < 18 中不支持,没有内置超时功能,需要手动检查状态码。
正确处理错误与超时
使用 HTTP 客户端时最常见的问题之一是忽略错误处理。网络是不可靠的,服务器可能返回 500 错误,或者根本不响应。