JavaScript HTTP客户端:在Node.js中正确发送请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么需要在 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 错误,或者根本不响应。

博客

书籍推荐