nodejs第二天
一、实现一个Web服务器
1.工作原理
使用http模块在本机上创建一个Web服务器,它来接收浏览器的请求,并给出响应。
2.用http 模块写一个简单的web服务器
(1)引入http核心模块 (2)使用createServer来创建服务 (3)使用listen来启动服务,端口为8001(端口可以修改 0 - 65535) (4)在浏览器输入http://127.0.0.1:8001回车即可看到服务器响应回来的信息:OK (5)也可以通过ipconfig查看你的本机ip,通过 http://局域网ip:8001回车访问
3.通过 req.url来获取当前请求的url路径
4.代码
const server=http.creatServer((req,res)=>{
console.log(req.url)
})
5.res.end()设置响应体
(1)语法:
res.end(响应的数据)
// end()只能传入buffer或者是String类型的数据
// 注意:一次请求只能有一个res.end()响应,多个以第一个响应的数据为准,同时服务器报错终止
(2)res.setHeader(“Content-Type”,”text/html;charset=utf8”)设置响应头解决中文乱码
(3)res.statusCode设置状态码
const server=http.creatServer((req,res)=>{
console.log(req.url)
res.statusCode = 404 ;
})
// res.statusCode = 状态码,状态码是http协议规定的
// 状态码: 500 (服务器异常) 404(资源找不到)
(4)在http协议中,content-type用来告诉对方本次传输的数据的类型是什么
①在请求头中设置content-type来告诉服务器,本次请求携带的数据是什么类型的
②在响应头中设置content-type来告诉浏览器,本次返回的数据是什么类型的
③res.setHeader方法可以设置content-type这个响应头,浏览器根据不同类型做出不同解析
④常见的几种文件类型及content-type
.html:res.setHeader('content-type', 'text/html;charset=utf8')
.css:res.setHeader('content-type', 'text/css;charset=utf8')
.js:res.setHeader('content-type', 'application/javascript')
.png:res.setHeader('content-type', 'image/png')
json数据:res.setHeader('content-type', 'application/json;charset=utf-8')
6.URLSearchParams 解析参数
URLSearchParams可以将查询字符串解析成一个对象,通过get方法获取到指定参数值 参考网址:点击查看 查询字符串格式: name=后裔&age=20
二、模块化与包管理工具
1.什么是模块化
(1)现实中的模块化: 乐高积木中的每个积木就是一个模块,通过不同模块的组合就可以组合成最终想要的形状 (2)前端的模块化: 每个js文件看作是一个模块,每个模块通过固定的方式引入,并且通过固定的方式向外暴露指定的内容
2.自定义模块
(1)场景:使用自定义模块实现在index.js中使用tool.js中的加法函数
// index.js
const add = require("./tools");
const res = add(1, 21);
console.log("res", res);
// tools.js
function add(a, b) {
return a + b;
}
const aa = 123;
// 导出
module.exports = add;
// module.exports = aa;
三、npm管理第三方模块
1.什么是npm工具
npm是node的包管理工具,它的出现是为了解决 Node中第三方包共享的问题
2.npm这个工具在安装node时,就会自动安装上
3.场景:通过npm下载一个格式化日期包并使用它
①创建一个新的空文件夹(注意命名不能是中文或者)
(注意:文件夹不能包含中文或者特殊字符,如果之前已经初始化,则可以省略)
②执行npm init --yes 初始化package.json
npm init
③去npmjs.com网站 搜索 关键字 date 找到合适的格式化日期包
④按照文档完成下载(使用npm install 包名称 下载)
npm install
⑤通过require使用第三方包
4.全局包nrm的作用
nrm:别人开发的一个第三方包,可以帮助我们切换安装包的下载源地址
// npm init 前 输入 ,防止国外资源下载过慢,用国内下载资源
npm config set registry https://registry.npm.taobao.org
四、服务器进阶express
1.使用步骤
// 1.导包
const express = require("express")
const fs = require("fs")
//2.创建服务
const server=express()
// 获取请求体数据需要主动开启,不开启功能 req.body 的值为 undefined
server.use(express.urlencoded())
// 3.业务代码
server.get((req,res)=>{
res.send("主页")
})
...
业务代码 根据 请求方式 读取和写入完成对应数据功能处理
// 4.启动服务 监听
server.listen(8000, () => {
console.log('服务器启动成功~')
})
2.业务代码部分(学员案例)
(1)查询全部学员
server.get('/student', (req, res) => {
// 读取文件
fs.readFile('./db/student.json', (err, data) => {
// 如果读取失败,就响应失败的提示
if (err) return res.send({ code: 1, message: '查询失败' })
// 成功响应
res.send({
code: 0,
message: '获取成功',
data: JSON.parse(data), // 把 Buffer 缓存解析成数组
})
})
// res.send('查询全部学员') // 🚨 只能执行其中一个 res.send(),所以这里要删除掉
})
(2)添加学员(思路:先读取原有数据,对数据进行对应解析,在插入对应的新增数据,重新写入)
server.post('/student', (req, res) => {
console.log('请求体数据', req.body)
// 读取文件
fs.readFile('./db/student.json', (err, data) => {
// 失败提示
if (err) return res.send({ code: 1, message: '查询失败' })
// 把读取的文件解析成数组
const arr = JSON.parse(data)
// 处理学生格式
const stu = {
id: Date.now(),
name: req.body.name,
age: Number(req.body.age),
sex: req.body.sex,
}
// 追加新学生信息
arr.push(stu)
// 把新数据写入文件,注意参数二需要转 JSON 字符串
fs.writeFile('./db/student.json', JSON.stringify(arr, null, 2), err => {
// 失败提示
if (err) return res.send({ code: 1, message: '添加失败' })
// 成功提示
res.send({ code: 0, message: '添加学员成功' })
})
})
// res.send('添加学员')
})
(3)删除学员(获取需删除的id人员的对应信息,通过filter()对比id,进行过滤,过滤掉需删掉的id数据)
server.delete("/student", (req, res) => {
// 拿到id
console.log(req.query);
fs.readFile("./db/index.json", (err, data) => {
if (err) return res.send({ code: 1, msg: "读取失败" });
const arr = JSON.parse(data);
// filter 过滤数组,将不等于删除id的元素装进newArr,过滤掉需要删除的id
const newArr = arr.filter((item) => item.id !== Number(req.query.id));
// console.log(newArr);
fs.writeFile("./db/index.json", JSON.stringify(newArr, null, 2), (err) => {
if (err) return res.send({ code: 1, msg: "删除失败" });
// 成功
res.send({ code: 0, msg: "删除成功" });
});
});
});
(4)修改学员(通过find获取到对应的id,更改对应的数据,实现修改)
server.put("/student", (req, res) => {
fs.readFile("./db/index.json", (err, data) => {
if (err) return res.send({ code: 1, msg: "读取失败" });
const arr = JSON.parse(data);
const stu = arr.find((item) => item.id === Number(req.query.id));
stu.name = req.body.name;
stu.age = Number(req.body.age);
stu.sex = req.body.sex;
stu.phone = req.body.phone;
fs.writeFile("./db/index.json", JSON.stringify(arr, null, 2), (err) => {
if (err) return res.send({ code: 1, msg: "修改失败" });
// 成功
res.send({ code: 0, msg: "修改成功" });
});
});
});