nodejs(2)

153 阅读5分钟

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路径

1652249743193.png

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

1652250611997.png

二、模块化与包管理工具

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: "修改成功" });
    });
  });
});