目录
服务器端
1、基础概念
10135343
网站的组成
网站的应用程序主要分为:
客户端 —— 在浏览器中运行的部分,用户看到并与之交互的界面程序,使用 HTML、CSS、JS 构建;
服务器端 —— 在服务器中运行的部分,负责存储数据和处理应用逻辑,Node.js;
网站实际就是客户端和服务器基于请求和响应模型的一种应用结构。
Node 网站服务器
网站服务器就是能提供网站访问服务的电脑,能够接受客户端的请求,并对请求做出响应。
(以Node为运行环境)
IP地址(Internet Protocol Address)互联网协议地址,是网络中的唯一标识,用来查找服务器。
IP 地址对应了域名(网址);
端口用来区分服务器电脑中提供的不同服务;
URL(Uniform Resource Locator)统一资源定位符(网址),客户端访问服务器的请求地址,标记 Internet 网络上的资源位置;
组成:传输协议://服务器IP或域名:端口/资源所在位置标识 。
开发中的客户端 —— 浏览器,服务器端 —— Node ,是在同一台电脑上;
本机域名:localhost
本地IP:127.0.0.1
10302899
2、创建 web 服务器
利用 Node 创建软件层面上的网站服务器:
// 引用http系统模块
const http = require('http');
// 创建网站服务器对象
const app = http.createServer();
// 为服务器绑定一个request事件,当收到客户端的请求request时,触发响应response
app.on('request', (req, res) => {
res.end('<h1>Holle</h1>');
});
// 到此 web服务器 创建完成
// 监听端口
app.listen(3000);
// 服务器启动成功
访问:在浏览器中输入 localhost:3000
3、HTTP 协议
超文本传输协议(HyperText Transfer Protocol),提供了一种发布和接收 HTML 页面的方法,客户端与服务器端之间请求和响应的标准。
报文
在 http 请求和响应过程中传递的数据块,包括要传递的数据和一些附加信息;
分为请求报文和响应报文,内容都是以冒号分隔的键值对的形式。
请求报文
请求方式:GET 获取数据、POST 发送数据标识
GET:在浏览器中输入网址;表单的跳转行为;
POST:网站中的一般逻辑,如登录;
在服务器绑定的 request 事件中,可以通过 req.method 得到请求方式;
req.headers 获取请求报文,req.headers['键名'] 得到键值;
req.url 获取请求地址标识,可以根据请求地址或请求方式的不同而做不同的响应。
表单 <form> 标签中,
method 属性,指定表单提交的方式,默认 method="get";
action 属性,指定表单提交的地址。
响应报文
(1)HTTP 状态码:
- 200 请求成功
- 400 客户端请求有语法错误
- 404 请求的资源没有找到
- 500 服务器端错误
(2)响应内容类型
- text/html
- text/css
- application/javascript
- application/json
- image/jpeg
书写响应报文,设置状态码、内容类型、编码方式:
res.writeHead(状态码, {
'content-type': '内容类型;charset=utf8'
})
4、HTTP 请求与响应处理
请求参数
客户端向服务器端发送请求时,以请求参数的形式携带一下客户信息,如登录时的用户名和密码。
用到 http、url、querystring、fs、path、 util 内置模块
GET 请求参数
位于网址中的 query 参数:以 ?开头,后面的参数是等号分隔的键值对的形式;
如:http://localhost:3000/?name=Tom&age=20
Node.js 中有内置模块 url,用于处理 url 地址;
其中,解析 url 地址的方法:
url.prase(地址, query是否转换成对象形式)
将 url 解析成对象的形式,对象里面包含成员 query、pathname 等;
服务器端就可以将 GET请求参数 query 单独抽取出来进行处理。
POST 请求参数
位于请求报文中,服务器端是通过事件的方式接收 POST请求参数的;
在服务器的请求事件中,为 req参数 绑定 data、end 事件;
post 参数不是一次性都能接受的,所以接收时要将分开的参数进行拼接。
路由
是指客户端请求地址与服务器端程序代码的对应关系;
实际上是一串判断代码,判断客户端的请求方式、请求路径从而调用对应的响应程序。
静态 / 动态资源
静态资源是指服务器端不需要处理,可以直接响应给客户端的资源,如 CSS、JavaScript、image 文件;
动态资源是指请求地址相同时,请求参数不同,就得到不同的响应资源。
静态资源
在请求事件中,从获取的请求路径中得知所需资源,再读取对应的资源文件。
- 获取请求路径;
- 转化为文件实际的物理路径;
-
读取文件。
客户端请求路径
GET 方式:
- 浏览器地址栏
- link 标签的 href 属性
- script、img标签的 src 属性
- form 表单的提交 action
POST 方式:
- form 表单的提交 action
5、Node.js 异步编程
同步、异步 API(Promise)
同步API:只有当前 API 执行完成后,才能执行下一个 API;可以通过返回值得到执行的结果;
异步 API:当前 API 的执行不会阻塞后面代码的执行;要用回调函数才可以拿到异步API 执行的结果。
代码的执行顺序
若代码为同步的,就放到同步代码执行区;若为异步的,就放到异步代码执行区,并将其中的回调函数放到回调函数队列;
=> 先按顺序执行同步代码 => 然后看异步代码区中谁最先被调用,就执行对应的回调函。
Node.js 中的异步API
如 读取文件操作 fs.readFile(realPath, (err, doc) => {...});
事件处理函数 server.on('request', (req, res) => {...});
如果想要依次执行回调函数,就要在前一个回调函数中嵌套后一个,依次嵌套,就是“嵌套地狱”的问题。
为了解决 Node 异步编程中回调地狱的问题:Promise
原理:使 异步代码执行 与 结果处理 分离
- 在原本的异步API 外面包裹一层构造函数,生成 promise 对象;
- 将异步API 的执行结果以参数的形式传递出去;
- 在外部利用 promise 实例对象接收异步API 的执行结果,并做处理。
ES7 新增方法:异步函数
是异步编程的终极解决方案,进一步封装 promise 的代码,将异步代码写成同步的形式,更加清晰明了;
- 在普通函数前面加上 async 关键字,变成异步函数;
- 异步函数内默认的返回值是 promise 对象,如果是用 return 返回,结果也会被包裹在 promise 对象中(相当于 resolve);
- 异步函数内用 throw 关键字抛出异常程序,执行 throw 后就不再执行后面的程序;
- await 关键字调用异步函数(必须是 promise 对象),保证异步函数按顺序执行。
因为 await 关键字后面必须调用的是异步函数返回的 promise 对象,所以 Node.js 的 API 方法不能直接;
Node.js 提供了一个 promisify 方法(util 模块),使 模块的API方法 返回 promise 对象,就可以使用异步函数。