nodejs系列:7.node响应请求-下篇

157 阅读6分钟

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

系列介绍

该系列主要是介绍一些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安装

前言

在上一篇文章里nodejs系列:6.node响应请求-上篇,我们向node服务器发送请求,node服务器接受到请求,我们利用创建服务器的回调函数的第二个参数res,来设置响应请求的相关参数,然后把数据响应给到客户端。

但只是把一个字符串返回给到客户端,在我们平时开发的时候,后台通常会返回一个对象给到我们前端,然后我们前端从对象里面拿数据。

那在node服务器里,怎么把一个对象返回给到客户端呢?

7.node响应请求-下篇里,我们实现一下这个功能

实现

html页面

创建一个index.html页面,在html页面里,创建一个按钮

<button class="user">用户</button>

定义一个方法,里面用原生js写了一个ajax请求,用来发送ajax请求


function ajax(method,url){
            let xhr = new XMLHttpRequest()
            xhr.open(method,url)
            xhr.onreadystatechange=function(){
                if(xhr.readyState ==4){
                    if(xhr.status==200){
                        console.log(xhr.responseText);
                    }else{
                        console.log('请求失败');
                    }
                }
            }
            xhr.send()
        }

拿到按钮的dom实例,绑定点击事件,发送请求

let useBtn = document.querySelector('.user')
​
        useBtn.addEventListener('click',()=>{
            ajax('get','http://localhost:3000/user?id=1')
        })

html页面搭建完成

node服务器

创建一个index.js文件,引入http模块,创建服务器,监听端口。

引入url模块,解析请求url,拿到路由


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

接下来,我们使用res的setHeader方法,来设置响应请求的响应头,来避免跨域。


res.setHeader('Access-Control-Allow-Origin', '*')
res.setHeader('Access-Control-Allow-Headers', 'X-Rquested-With')
res.setHeader('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')

设置后,向node服务器发送请求,node服务器响应数据给到客户端,客户端就不会报跨域错误了。

接下来,写路由里面的操作逻辑。


if(pathname == '/user') {
        res.statusCode = 200
    }

然后,我们尝试一下,直接把一个对象响应回客户端,看下行不行。

先定义一个对象user


let user = {
            name:'tom',
            sex:'男',
            age:18
}

调用res的end方法,把它返回给到客户端


res.end(user)

在cmd里,运行node服务器,然后到浏览器里发送请求,查看打印信息

0002.png

请求失败了,到cmd里看下node有没有报错。

0003.png

node报错了,从报错信息了,大致可以看到,提示我们响应数据需要为stringbuffer格式。即不能直接传一个对象给到客户端。

这时候,就要用到响应头的一个字段了Content-type,用该字段来定义响应数据的格式

我们给响应头添加这个字段并设置值


res.setHeader('Content-Type', 'application/json;charset=utf-8')

它的意思是,响应请求里的数据为json格式,编码格式为utf-8。

接着我们把user对象转换成json格式,然后响应回客户端


res.end(JSON.stringify(user))

重新运行node服务器,到浏览器里发送请求,查看打印信息

0004.png

我们可以看到,数据成功响应回客户端了,此时数据的格式为json格式。我们再把json格式转换为对象就可以使用请求返回的数据了。

小结

我们向node服务器发送请求,node服务器解析url后,拿到路由。在不同的路由下,进行对应的逻辑处理,处理完后,利用res对象的end方法,把数据结果响应回客户端。不过这时只能返回stringbuffer格式的数据,如果你想要返回其它格式的数据,需要设置一下响应请求的请求头字段。

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

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