nodejs系列:10.node的querystring模块-下篇

156 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

系列介绍

该系列主要是介绍一些nodejs相关的基础知识,没有什么特别难的知识点,都是一些比较基础知识点。大家学习起来,也会比较容易理解和接收。

这些知识点,也是以前自己学习nodejs的时候,学习过的知识点。有些知识点,可能是由于学习的时间比较久了,也有可能是平时工作中用到的机会比较少,也差不多快把它们都忘记掉了。现在把它们都写下来,写成文章,一方面是记录下自己以前学习的nodejs知识点,一方面也是复习巩固自己以前学习的nodejs知识点。不要学着学着,就把以前的知识点都忘光了。

nodejs介绍

nodejs摘抄过来的node介绍:

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具!

Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使得 Node.js 的性能非常好。

Node.js 应用程序在单个进程中运行,无需为每个请求创建新的线程。 Node.js 在其标准库中提供了一组异步的 I/O 原语,以防止 JavaScript 代码阻塞,通常,Node.js 中的库是使用非阻塞范式编写的,使得阻塞行为成为异常而不是常态。

当 Node.js 执行 I/O 操作时(比如从网络读取、访问数据库或文件系统),Node.js 将在响应返回时恢复操作(而不是阻塞线程和浪费 CPU 周期等待)。

这允许 Node.js 使用单个服务器处理数千个并发连接,而不会引入管理线程并发(这可能是错误的重要来源)的负担。

Node.js 具有独特的优势,因为数百万为浏览器编写 JavaScript 的前端开发者现在无需学习完全不同的语言,就可以编写除客户端代码之外的服务器端代码。

在 Node.js 中,可以毫无问题地使用新的 ECMAScript 标准,因为你不必等待所有用户更新他们的浏览器,你负责通过更改 Node.js 版本来决定使用哪个 ECMAScript 版本,你还可以通过运行带有标志的 Node.js 来启用特定的实验性功能。

我们可以从介绍里面看到,nodejs还是挺棒的。

nodejs遵循的是commomjs规范,所以使用nodejs的时候,需要按照commomjs规范来编写代码。

环境安装

实现之前,你首先需要安装nodejs环境。因为我们写的代码需要在node环境上运行,如果你没有,那么文件会运行不了。

以下是nodejs的安装地址,如果你没有安装的话,可以先把它安装上。安装了可以忽略这一步,跳到下面一步。

nodejs安装

前言

前端发送请求给到node服务器,有时需要传递一些参数给到node服务器。

node服务器拿到请求参数,进行相应的逻辑处理,然后把结果返回给到客户端。

在前几篇文章里:2.url模块的介绍和使用-上篇3.url模块的介绍和使用-下篇,我们介绍了node的url模块。如果浏览器发送的是get请求,node服务器可以通过url模块,解析请求url,拿到传递的参数。

那么,如果浏览器发送的post请求,node服务器又怎么获取传递过来的请求参数呢?

这时,就要用到node的另外一个模块--querystring模块了。

querystring

querystring模块,提供了用于解析和格式化网址查询字符串的实用工具。

前言

在上一篇文章里nodejs系列:9.node的querystring模块-上篇,我们先把html页面创建好。把页面的逻辑也写好了,输入值,发送ajax请求,携带请求参数给到node服务器。

那么在下篇里,我们就要开始写node服务器的代码了。

前置知识

在创建服务器时,传入回调函数,回调函数的第一个参数,我们通常简写为req。但是这个req参数又是什么?

我们从nodejs官网查阅发现,req其实是一个Stream(流)对象。

Stream是在nodejs中处理流数据的抽象接口。

nodejs提供了许多流对象,例如对http服务器的请求。

Stream可以是可读的、可写的或者两者兼之都有。

对于Stream对象来说,如果想要获取其请求body的话,就不像获取静态的method和url那么容易了。

这时候,我们就要用到req对象的两个事件来处理了:

  • data:当服务端接收到数据时触发
  • end:当数据接收完时触发

我们可以监听req对象的dataend事件来处理请求里的body参数。

实现

先创建一个index.js文件。

引入htt模块,创建服务器,然后监听指定端口。

const http =require('http')
const server = http.createServer((req,res)=>{
})
server.listen(3000,()=>{
    console.log('服务器启动了');
})

node服务器已经创建好了,但是光有服务器不行,还需要用到我们的querystring模块。

引入querystring模块


const querystring = require('querystring')

在创建服务器的回调函数里,监听req对象的data事件。


const server = http.createServer((req,res)=>{
    let data =''
    req.on('data',function(chunk){
        console.log('chunk',chunk);
        data +=chunk
    })
})

接着,我们定义一个变量,用来接收请求传递过来的数据。

在cmd里,用node运行index.js文件,查看打印日志:

0001.png

我们可以看到,传递过来的是一个Buffer格式数据,我们定义一个变量data,来接收数据。

接着,监听req对象的end事件


 req.on('end',function(){
        console.log(data);
 })

发送请求给到node服务器,当数据接收完毕后,就会触发req对象的end事件。

先是把data变量的值打印出来,看下是什么

0002.png

我们可以看到,是一个字符串。正是html页面发送请求时,传递过来的参数。

这是一个字符串,取值不是特别方便,如果转换成对象,取值是不是就很方便了?

接着,我们用querystring模块,来把字符串转换成对象。


let obj = querystring.parse(data)
console.log('obj',obj);

在cmd里,用node运行index.js文件,查看打印日志:

0003.png

打印日志里,我们可以看到,字符串被转换成对象了。从对象里取值,就非常方便了。

小结

前端发送ajax请求,如果发送的是post请求,请求参数是在请求的body里面传递的。当请求发送到到node服务器时,node服务器就不能通过url模块解析请求url的方式拿到请求参数了。这时候就要用到node的另外一个模块querystring模块了。

  • 先是监听req对象的data事件,拿到post请求传递过来的数据。
  • 然后监听req对象的end事件,数据传送完成后,就会触发end事件。
  • 我们在end事件里,使用querystring的parse方法,把数据解析成对象格式,方便我们后续取值。

最后,放上自己比较喜欢的一句诗句:

千淘万漉虽辛苦,吹尽狂沙始到金 - 唐 刘禹锡《浪淘沙》