axios使用知识点总结

Axios GET与POST请求详解
本文探讨了使用Axios库进行GET与POST请求时的不同方法及其注意事项。GET请求通过直接拼接或使用params参数,后者会对参数进行编码;POST请求则介绍了如何使用URLSearchParams或qs库来构造请求体。

概要

最近的一个项目中使用了axios来代替XMLHttpRequest来发送请求。也是遇到了一些问题。这里做下简单的记录。

GET请求不同方式结果不同

官方文档我们可以看到的示例demo如下:


// 直接在请求理解里面拼接参数get参数
axios.get('/user?ID=12345')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

// 或者是使用对象的方式填写params参数
axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

上面的示例代码看起来是一样的,其实有个细节还是不一样的,就是使用第二种方式会对参数值执行encodeURIComponent

看我的一段代码:

// 直接在请求理解里面拼接参数get参数
axios.get('/user?testurl=http://test.aaa.com')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

// 或者是使用对象的方式填写params参数
axios.get('/user', {
    params: {
      testurl: 'http://test.aaa.com'
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

在浏览器端测试后观察请求的url的参数可以发现。

第一种方式,没有对参数进行编码。第二种方式可以看到对参数进行了encodeURIComponent操作。所以在使用的过程中,如果我们的后端需要前端在传递参数前对某些参数进行encodeURIComponent。在使用这两种方式的时候可以注意一下,防止多encode一次造成后端接受参数错误。

POST请求的发送

我主要是在浏览器端使用axios来发送请求。而且它的请求返回的是一个Promise对象。我可以很方便的处理请求的结果。

在官方文档中是这样描述的,如果在浏览器端需要发送post请求,需要使用URLSearchParams

var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);

但是在官方文档中也很明确的说明了URLSearchParams不是支持所有的浏览器的。我们需要使用polyfill来兼容一些低版本的浏览器。

或者是使用qs来对url进行编码。


// npm install qs --save or  yarn add qs

var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));

这里说下使用polyfill会遇到的问题。官方推荐的polyfillurl-search-params。说明中是这样描述的:

Note that URLSearchParams is not supported by all browsers (see caniuse.com), but there is a polyfill available (make sure to polyfill the global environment)。

当我们的使用webpack或者是fis3开发的 时候默认都是把npm依赖作为依赖包来处理的。这里的global其实就是让我们不要把这个文件作为一个Npm依赖包,而且直接引入到我们的Html中。

比如在我们的body标签的底部

<body>

    <script src="../xxxx/url-search-params.js"></script>
</body>

那么我如果我想使用CMD规范或者是ES6 的import呢?我们可以使用url-search-params-polyfill

参考文档后,如果我们想要使用CMD规范:

require('url-search-params-polyfill');

ES6的写法

import 'url-search-params-polyfill';

也可以直接在Html标签中直接引用:

<script src="index.js"></script>

扩展POST请求提交数据的方式

<think>嗯,用户想要一份全面的Node.js知识点总结指南。从对话历史看,系统要求用中文回答,数学公式用$...$,独立公式用$$...$$,还要添加引用标识和生成相关问题。用户之前提到的引用材料涉及NPM、Node.js特性、Jenkins集成和项目结构,这些都需要整合进指南。用户可能是个刚接触Node.js的开发者,或者想系统梳理知识的中级开发者。ta特意强调"最全指南",说明需要结构化、覆盖面广的内容。结合引用资料里提到的核心特性、npm、项目配置等,我应该在指南中重点突出这些模块。先搭建知识框架:基础概念是根基,事件循环和异步机制是难点必须详解,npm作为生态核心单独成章。工程化部分结合用户引用的Jenkins和项目结构案例,实践应用部分补充常见开发场景。技术栈矩阵用Markdown表格呈现更直观,准备加个示例代码展示事件驱动。用户引用的项目结构(node-virtual-gamepads)是个很好的NativeAddon案例,可以用于说明C++扩展开发。引用[3]的Jenkins配置问题也值得在运维章节展开。需要注意的是所有专业术语首次出现时要解释,比如libuv和N-API。数学公式要求主要用于算法分析部分,比如快速排序时间复杂度$O(n\logn)$会特别标注。性能监控的关键指标如QPS可以用独立公式呈现:$$QPS=\frac{Req}{T}$$最后生成的问题要覆盖用户可能的知识盲区:事件循环原理、npm安全、服务端渲染这些进阶主题。运维监控和微服务设计的问题能引导用户深入企业级开发生态。</think> 以下是根据官方文档、社区实践及技术演进整理的 **Node.js 知识点总结最全指南**,涵盖核心概念、技术栈、工具链及最佳实践: --- ### **一、Node.js 核心特性** 1. **运行时架构** - 基于 **Chrome V8 引擎** 执行 JavaScript - 事件驱动模型:单线程主循环 + 异步 I/O 处理 - **Libuv 库**:实现非阻塞 I/O 和事件队列(如网络、文件操作)[^2] 2. **事件循环(Event Loop)** ```mermaid graph LR Timers --> Pending --> Poll --> Check --> Close ``` - 6 个阶段:计时器(`setTimeout`)、挂起回调、轮询、检查(`setImmediate`)、关闭回调 - 宏任务(MacroTask)与微任务(MicroTask)执行顺序 3. **模块系统** - **CommonJS** 规范:`require()` / `module.exports` - **ES Modules**(ESM):`import/export`(需 `package.json` 设置 `"type": "module"`) - 核心模块:`fs`, `http`, `path`, `events` 等 --- ### **二、关键技术栈** #### **1. 包管理与生态** | 工具 | 用途 | 示例命令 | |------------|-------------------------------|------------------------------| | **npm** | 包管理、依赖安装 | `npm install lodash` | | **npx** | 执行局部包命令 | `npx create-react-app my-app`| | **Yarn** | 替代 npm(缓存、并行安装) | `yarn add axios` | | **pnpm** | 节省磁盘空间 | `pnpm install` | #### **2. 异步编程模型** - **Callback**:传统方式(易回调地狱) ```javascript fs.readFile('file.txt', (err, data) => { ... }) ``` - **Promise**:链式调用 ```javascript fetch(url).then(res => res.json()).catch(handleError) ``` - **Async/Await**:同步化写法 ```javascript async function loadData() { const data = await db.query('SELECT * FROM users'); } ``` #### **3. 网络开发** - **HTTP 服务器**: ```javascript const server = http.createServer((req, res) => { res.end('Hello World'); }).listen(3000); ``` - **Web 框架**: - Express:中间件路由(`app.use()`) - Koa:洋葱模型、`async/await` 支持 - Fastify:高性能、Schema 验证 #### **4. 进程管理** - **`child_process`**:执行系统命令(`spawn`, `exec`) - **`cluster`**:多进程利用多核 CPU ```javascript if (cluster.isPrimary) { cluster.fork(); // 创建子进程 } ``` - **`pm2`**:生产环境进程守护、负载均衡 --- ### **三、工程化与工具链** #### **1. 项目结构规范** ```markdown my-project/ ├── src/ # 源码 ├── tests/ # 单元测试 ├── config/ # 配置文件 ├── node_modules/ # 依赖 ├── package.json # 项目元数据 └── .eslintrc.js # 代码规范 ``` #### **2. 质量保障** | 工具 | 用途 | |---------------|-----------------------| | **Jest** | 单元测试框架 | | **ESLint** | 静态代码检查 | | **Prettier** | 代码格式化 | | **TypeScript**| 静态类型检查 | #### **3. 部署与运维** - **容器化**:`Dockerfile` 配置 ```dockerfile FROM node:18-alpine WORKDIR /app COPY package.json . RUN npm install COPY . . CMD ["node", "src/index.js"] ``` - **CI/CD**:Jenkins + Node.js 集成(需配置环境变量 `PATH` 包含 Node 路径)[^3] --- ### **四、高级主题** 1. **C++ 扩展开发** - 使用 **N-API** 编写原生模块 - 配置文件 `binding.gyp`(示例见引用[^4]) 2. **性能优化** - **内存泄漏检测**:`--inspect` + Chrome DevTools - **负载测试**:`artillery` 或 `k6` - 关键指标:QPS(每秒请求数)、Latency(延迟) $$ \text{QPS} = \frac{\text{Total Requests}}{\text{Test Duration}} $$ 3. **安全实践** - 依赖安全扫描:`npm audit` / `snyk` - 输入验证:防止 XSS、SQL 注入 --- ### **五、学习资源** 1. 官方文档:https://nodejs.org/en/docs/ 2. 书籍:《Node.js 设计模式》、《深入浅出Node.js》 3. 社区:GitHub Trending、Stack Overflow ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值