http模块
搭建服务器的步骤
① 导入 http 模块
② 创建 web 服务器实例
③ 为服务器实例绑定 request 事件,监听客户端的请求
④ 启动服务器
// ① 导入 http 模块
const http = require('http');// ② 创建 web 服务器实例
const server = http.createServer();// ③ 为服务器实例绑定 request 事件,监听客户端的请求
// server.on('事件名称', 处理函数);// 只要客户端发来请求,则会触发下面的事件
server.on('request', function () {console.log('你的请求我收到了');
});// ④ 启动服务器
server.listen(3000, function () {// 服务器启动之后,会触发这个回调函数console.log('my first web server start~');
});
测试:
- node执行你的JS代码
- 打开客户端(浏览器、postman),向服务器发送请求(localhost:3000)
- 查看,代码中的请求事件,是否触发了,如果触发了,表示请求成功了
使用http搭建服务器的问题
-
代码如果更改了,则需要重新启动服务器,你的代码才会生效
- Ctrl + C , 先终止服务
- 再次执行 node xxx.js 重新启动服务即可
-
vscode 终端的使用问题
URL的组成
http://www.xxxx.com:3000/yyy/zzz?id=123
- 协议
- http
- https
- 主机地址(找到服务器)
- 指向服务器的域名,(localhost 永远指向自己的计算机)
- 服务器的IP地址 (127.0.0.1 永远指向自己的计算机)
- 端口
- 作用是区分服务器上的每个服务的
- 可以通过
netstat -an
查看已经被占用的端口
- 文件路径部分(/api/getbooks index.html /a/b/c/xxx.html)
- 查询字符串部分(GET请求的参数)
获取请求相关的信息
server.on('request', function (req) {// req 对象,是根据 http.IncomingMessage类得来的对象// 通过这个对象,我们可以得到请求的相关信息req.url // 表示请求的urlreq.method // 表示请求方式req.headers // 表示请求头
})
得到请求相关的信息之后,方便服务器做出判断
服务器做出响应
server.on('request', function (req, res) {// 所有和请求相关的信息,都是通过req对象获取的// 所有和响应相关的信息,都通过res来完成。res这里是response的意思。// console.log(res instanceof http.ServerResponse); // true// res.end(); // 用于做出响应// res.setHeader(name, value); // 设置响应头// res.statusCode // 设置响应状态码// res.writeHead(状态码, {响应头})// 告诉浏览器,响应的数据是什么类型、什么编码// res.setHeader('Content-Type', 'text/html; charset=utf-8');// res.statusCode = 404; // 随便设置的状态码,实际中应该是200res.writeHead(200, {// key: value'Content-Type': 'text/html; charset=utf-8','Author': 'LaoTang', // 随便写的,实验一下。值不能用中文});res.end('你好浏览器,你的请求我收到了,这是给你的回应');
})
GET方式的接口
-
提供数据给客户端(终极目标)
-
具体的获取书籍的接口
- 读取books.json里面的内容
- fs.readFile() — 读取的结果是json格式
- require() — 读取的结果是array格式
- 把读取的结果响应给客户端 — 响应的结果,必须是json字符串格式
- 遇到的问题
- 解决跨域的问题 – 设置响应头
- 解决编码的问题 – 设置响应头
- 读取books.json里面的内容
POST方式的接口
- 接收并保存数据(终极目标)
- 如何接收POST请求体
- 定义空字符串,比如str
- 注册req的data事件,用于接收客户端提交的数据
- 注册req的end事件,当完全接收到了客户端提交的数据,会触发这个事件
- 保存数据
- 做出响应
// 加载所需的模块
const fs = require('fs');
const path = require('path');
const querystring = require('querystring');
// 搭建服务器
const http = require('http');
const server = http.createServer();
server.listen(3006, () => console.log('图书管理案例接口服务启动了'));server.on('request', (req, res) => {// 客户端都会发送什么类型的请求,请求的url又是什么let method = req.method; // 获取请求方式let url = req.url; // 获取请求的url// 定义书籍 books.json的绝对路径let filename = path.join(__dirname, 'books.json');// 判断,请求的是否是获取图书的接口if (method === 'GET' && url === '/api/getbooks') {// 说明客户端请求的就是获取书籍的接口// 把所有书籍信息响应给客户端// 读取books.json里面的内容,把读取的结果响应给客户端// 读取json文件,可以直接使用 require let data = require(filename);// console.log(data); // 得到一个数组res.writeHead(200, {'Access-Control-Allow-Origin': '*', // 解决跨域问题'Content-Type': 'application/json; charset=utf-8'});res.end(JSON.stringify({status: 200,msg: '获取图书成功',data: data}));} else if (method === 'POST' && url === '/api/addbook') {// 说明请求的是添加图书的接口// console.log(111);// 1. 接收客户端提交的数据// 1.1 定义一个空字符串,一会要把接收到的数据拼接到空字符串中let str = '';// 1.2 注册req的data事件,用于接收客户端提交的数据// 当接收到客户端的提交的数据的时候,就会触发这个事件,形参chunk就是接收到一部分数据req.on('data', (chunk) => {str += chunk;});// 1.3 注册req的end事件,当完全接收到了客户端的数据之后,会触发req.on('end', () => {// console.log(str); // 完整的数据 // bookname=aaa&author=bbb&publisher=ccc// 2. 保存到 books.json中let old = require(filename); // 得到数组let newBook = querystring.parse(str);newBook.id = Date.now(); // 临时使用时间戳当做idold.push(newBook);fs.writeFile(filename, JSON.stringify(old), (err) => {if (err) return console.log(err);// 没有错误,保存成功// 3. 做出响应res.writeHead(200, {'Access-Control-Allow-Origin': '*', // 解决跨域问题'Content-Type': 'application/json; charset=utf-8'});res.end(JSON.stringify({status: 201,msg: '添加图书成功',}));});});} else {res.end('错误');// 说明客户端代码写错了。客户端请求了一个不存在的资源}
});
npm初步使用
介绍
npm(node package manager)node包管理器。
包是什么?包就是模块。
npm这个工具,在安装node的时候,就已经安装到你的计算机中了。
命令行中执行: npm -v
,如果看到版本号,说明安装成功了。
作用
npm的作用是:管理node模块的工具。
- 下载并安装第三方的模块
- 卸载第三方模块
- 发布模块
- 删除已发布的模块
- …
第三方模块:
- 非内置模块,安装完node,还不能使用的模块,需要从网上下载安装,才能使用的模块
- 第三方模块是个人、公司、组织编写的模块,发布到网上,供我们使用
npm 就是一个管理(下载安装、卸载…)第三方模块的工具
初始化
使用npm工具之前,必须先初始化。
npm init -y
# 或
npm init
# 然后一路回车
初始化之后,会在项目目录中生成 package.json 的文件。
什么第三方模块
非node自带的模块。
是别人写的模块,然后发布到npm网站,我们可以使用npm工具来下载安装别人写的模块。
第三方模块,都是在node核心模块的基础之上,封装了一下,实现了很多非常方便快速简洁的方法。
目前,npm网站收录了超过 150万个第三方模块。
安装卸载项目模块
下载安装第三方模块
npm install 模块名
npm i 模块名
卸载模块
npm uninstall 模块名
npm un 模块名
关于项目模块的说明
- 下载安装的模块,存放在当前文件夹的
node_modules
文件夹中,同时还会生成一个记录下载的文件package-lock.json
- 下载的模块,在哪里可以使用
- 在当前文件夹
- 在当前文件夹的子文件夹
- 在当前文件夹的子文件夹的子文件夹
- …
- 怎样使用第三方模块
- 和使用内置模块一样,需要使用
require
加载模块 - 调用模块提供的方法完成工作(一般好的模块都会用使用文档的)
- 和使用内置模块一样,需要使用
演示下载安装第三方模块:moment
这里演示一个处理时间日期的模块 – moment
下载安装moment模块
npm init -y
npm i moment
演示使用moment模块处理时间
// 加载模块
const moment = require('moment');console.log(moment().format('YYYY-MM-DD hh:mm:ss'));
// 官网:http://momentjs.cn
全局模块
-
全局安装的模块,不能通过
require()
加载使用。 -
全局安装的模块,一般都是命令或者工具。
-
安装方法,在安装模块的命令后面,加
-g
npm i 模块名 -g # 或 npm i -g 模块名
-
卸载方法(也是多一个
-g
)npm un 模块名 -g
-
全局安装的模块,在系统盘(C盘)
- 通过命令
npm root -g
可以查看全局安装路径
- 通过命令
mac安装过程可能出现权限问题,可以使用 sudo npm i xxx -g
全局安装nodemon模块
-
安装命令
npm i nodemon -g
-
nodemon的作用:
-
代替node命令,启动服务的,当更改代码之后,nodemon会自动帮我们重启服务。
-
运行nodemon,如果报错如下:
-
解决办法是:
管理员
方式,打开命令行窗口- 执行
set-ExecutionPolicy RemoteSigned;
- 在出现的选项中,输入
A
,回车。即可
更改镜像源
镜像源,就是下载安装第三方模块的网站。
我们下载的第三方模块都是从国外的npm主站下载的,速度比较慢。
淘宝在国内对npm上的第三方模块做了一个备份,也就是说,我们可以从国内下载第三方模块。
除了淘宝之外,还有很多其他镜像源。
简单的更改镜像源方法:
- 全局安装 nrm 的模块
npm i nrm -g
- nrm 用于管理镜像源
- 使用nrm
nrm ls
通过这个命令,可以查看可用的镜像源nrm use taobao
,切换下载模块的网站为淘宝
注意 :如果 nrm 安装失败,请修改电脑的环境变量,给环境变量添加上 npm 的绝对地址,再次查询即可
查询版本
nrm - y
使用已下nmp 代码可以根据 package.json重新安装node_modules中的模块信息
npm i
如果安装出现错误:
1. 查看 npm 版本
2. 镜像源的配置