持续创作,加速成长!这是我参与「掘金日新计划 · 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的安装地址,如果你没有安装的话,可以先把它安装上。安装了可以忽略这一步,跳到下面一步。
前言
前端发送请求给到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对象的data和end事件来处理请求里的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文件,查看打印日志:
我们可以看到,传递过来的是一个Buffer格式数据,我们定义一个变量data,来接收数据。
接着,监听req对象的end事件
req.on('end',function(){
console.log(data);
})
发送请求给到node服务器,当数据接收完毕后,就会触发req对象的end事件。
先是把data变量的值打印出来,看下是什么
我们可以看到,是一个字符串。正是html页面发送请求时,传递过来的参数。
这是一个字符串,取值不是特别方便,如果转换成对象,取值是不是就很方便了?
接着,我们用querystring模块,来把字符串转换成对象。
let obj = querystring.parse(data)
console.log('obj',obj);
在cmd里,用node运行index.js文件,查看打印日志:
打印日志里,我们可以看到,字符串被转换成对象了。从对象里取值,就非常方便了。
小结
前端发送ajax请求,如果发送的是post请求,请求参数是在请求的body里面传递的。当请求发送到到node服务器时,node服务器就不能通过url模块解析请求url的方式拿到请求参数了。这时候就要用到node的另外一个模块querystring模块了。
- 先是监听req对象的
data事件,拿到post请求传递过来的数据。 - 然后监听req对象的
end事件,数据传送完成后,就会触发end事件。 - 我们在
end事件里,使用querystring的parse方法,把数据解析成对象格式,方便我们后续取值。
最后,放上自己比较喜欢的一句诗句:
千淘万漉虽辛苦,吹尽狂沙始到金 - 唐 刘禹锡《浪淘沙》