Node学习第三天

170 阅读9分钟

01-nodejs搭建静态资源服务器

  • 1.html中所有外部资源路径都会变成网络请求
    • 服务器需要根据请求路径响应返回对应的文件
  • 2.静态资源(图片、文件、音视频)一般使用路径拼接的方式来处理
    • 服务端可以直接拼接url来响应对应资源,简化代码

1.1-nodejs搭建静态资源服务器01

1571414311893.png

/*WEB开发特点1:html中所有外部资源路径都会变成网络请求
*/

//1.导入模块
//http模块
const http = require('http')
//fs文件模块
const fs = require('fs')
//path路径模块
const path = require('path')


//2.创建服务器
let server = http.createServer((req, res) => {
    console.log(req.url)

    if (req.url == '/') {
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname, 'www',  'index.html'), (err, data) => {
            if (err) {
                throw err//如果读取失败,抛出异常
            } else {
                res.end(data)//如果读成功,响应给客户端
            }
        })
    } else if (req.url == '/resource/css/index.css') {
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname, 'www','resource', 'css', 'index.css'), (err, data) => {
            if (err) {
                throw err//如果读取失败,抛出异常
            } else {
                res.end(data)//如果读成功,响应给客户端
            }
        })
    } else if (req.url == '/resource/images/01.gif') {
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname, 'www','resource', 'images', '01.gif'), (err, data) => {
            if (err) {
                throw err//如果读取失败,抛出异常
            } else {
                res.end(data)//如果读成功,响应给客户端
            }
        })
    } else if (req.url == '/resource/images/01.jpg') {
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname, 'www','resource', 'images', '01.jpg'), (err, data) => {
            if (err) {
                throw err//如果读取失败,抛出异常
            } else {
                res.end(data)//如果读成功,响应给客户端
            }
        })
    } else if (req.url == '/resource/video.mp4') {
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname, 'www','resource', 'video.mp4'), (err, data) => {
            if (err) {
                throw err//如果读取失败,抛出异常
            } else {
                res.end(data)//如果读成功,响应给客户端
            }
        })
    } else if (req.url == '/resource/favicon.ico') {
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname, 'www','resource', 'favicon.ico'), (err, data) => {
            if (err) {
                throw err//如果读取失败,抛出异常
            } else {
                res.end(data)//如果读成功,响应给客户端
            }
        })
    } else {
        res.end('404 not found')
    }
})

//3.开启服务器
server.listen(3000, () => {
    console.log('服务器启动成功')
})

1.2-nodejs搭建静态资源服务器02

/*
WEB开发特点1:html中所有外部资源路径都会变成网络请求
WEB开发特点2:静态资源(图片、文件、音视频)一般使用路径拼接的方式来处理
*/

//1.导入模块
//http模块
const http = require('http')
//fs文件模块
const fs = require('fs')
//path路径模块
const path = require('path')


//2.创建服务器
let server = http.createServer((req,res)=>{
    console.log(req.url)
    
    if(req.url == '/'){
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname,'www','index.html'),(err,data)=>{
            if(err){
                throw err;//如果读取失败,抛出异常
            }else{
                res.end(data);//如果读成功,响应给客户端
            }
        })
    }else if(req.url.indexOf('/resource') == 0){//只要路径以/resource开头,直接拼接返回
        //读取文件响应给客户端
        fs.readFile(path.join(__dirname,'www',req.url),(err,data)=>{
            if(err){
                throw err//如果读取失败,抛出异常
            }else{
                res.end(data)//如果读成功,响应给客户端
            }
        })
    }else{
        res.end('404 not found')
    };
});

//3.开启服务器
server.listen(3000,()=>{
    console.log('服务器启动成功')
})

02-Express使用

1.1-Express框架介绍

  • 1.Express是NodeJS开发中一个非常重量级的第三方框架,它对于NodeJS服务端就相当于Jquery对于HTML客户端。

    • 如果连Express都不会用,基本上都不好意思跟别人说你会NodeJS
  • 2.Express官网:

  • 3.Express的github地址:github.com/expressjs/e…

    • Express的原作者TJ在node社区非常的有名,他写过200多个框架,目前他已经将Express交给了朋友维护,宣布不再维护NodeJS框架,转向Go语言github.com/tj
  • 4.Express官网是这样介绍自己的:基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    • Express一个非常重要的亮点就是它没有改变nodejs已有的特性,而是在它的基础上进行了拓展
      • 也就是说,使用Express你既可以使用nodejs原生的任何API,也能使用Express的API
  • 5.Express三大核心功能

    • 1.托管静态资源
      • 第二天讲的nodejs实现静态服务器功能在express中只需要一行代码
    • 2.路由
      • express自带路由功能,让Node服务端开发变得极其简单
      • express支持链式语法,可以让代码看起来更加简洁
    • ==3.中间件==
      • Express最为核心的技术和思想,万物皆中间件
        • 中间件虽然理解起来有点困难,但是使用起来非常方便,类似于bootstrap插件.
  • 下载express命令: npm i express

    • 如果你的网速很慢,可以在你的任意终端执行命令来提速:npm config set registry https://registry.npm.taobao.org/

1571668969095.png

1.2-Express基本使用

//1.导入模块
const express = require('express')

//2.创建服务器
/* express() 相当于http模块的http.createServer() */
const app = express()


//3.接收客户端请求
/*(1)express最大的特点就是自带路由功能,我们无需在一个方法中处理所有请求
		* 路由:一个请求路径对应一个方法(函数)
   (2)在express中,每一个请求都是一个单独的方法
 */

app.get('/',(req,res)=>{
    //响应客户端数据

    //express响应数据 send方法:自动帮我们设置好了响应头,无需担心中文乱码问题
    res.send('欢迎来到黑马程序员')

})

app.get('/heroInfo',(req,res)=>{
    
    res.send({
        name:'张三',
        age:20
    })
})

//4.开启服务器
app.listen(3000,()=>{
    console.log('服务器启动成功')
})

1.3-Express响应客户端数据

//1.导入模块
const express = require('express')

//2.创建服务器
/* express() 相当于http模块的http.createServer() */
const app = express()


//3.接收客户端请求

//文本类型数据
app.get('/',(req,res)=>{
    //响应客户端数据
    res.send('欢迎来到黑马程序员')
})

//json格式数据
app.get('/info',(req,res)=>{
    //express自动帮我们将js对象转成json响应给客户端
    res.send({
        name:'张三',
        age:20
    })
})

//文件类型数据
app.get('/login',(req,res)=>{
    res.sendFile(__dirname + '/login.html')
})

//4.开启服务器
app.listen(3000,()=>{
    console.log('服务器启动成功')
})

1.4-Express托管静态资源

//1.导入模块
const express = require('express');

//2.创建服务器
const app = express()

//托管静态资源(相当于我们之前写的静态资源服务器)
/* 
1.当请求路径为/时,express会自动读取www文件夹中的index.html文件响应返回
2.当路径请求为www文件夹中的静态资源,express会自动拼接文件路径并响应返回
*/
app.use(express.static('www'))

//4.开启服务器
app.listen(3000,()=>{
    console.log('success')
})

==1.5-第三方中间件使用==

  • 1.在Express官网,有非常多得第三方中间件,它们可以让我们的Nodejs开发变得极其简单

    • 中间件前端的插件,使用后就会给express中的req或者res添加成员
  • 2.所有的第三方框架学习套路都是一样的

    • 1.进官网,查文档
    • 2.CTRL+C 与 CTRL+V
  • 3.第三方中间件使用步骤一般都是固定两步

    • 一: 安装 npm i xxxx(官网复制粘贴)
      • 第三方中间件都需要使用npm安装,可以理解为是一种特殊的第三方模块
    • 二: 使用 app.use(xxx)(官网复制粘贴)
  • body-parse第三方中间件:解析post请求参数

//导入模块
const express = require('express')
//创建服务器
const app = express()

//使用第三方中间件
/*所有的第三方模块思路都是一样 
    1.进官网,查文档
    2.找examples(使用示例),复制粘贴
        a.安装第三方模块:`npm i body-parser`
        b.使用中间件: arr.use(具体用法请复制粘贴) 
使用body-parser中间件之后,你的req会增加一个body属性,就是你的post请求参数
*/
//(1)导入模块
const bodyParser = require('body-parser')
// parse application/x-www-form-urlencoded 
//(2)使用中间件
app.use(bodyParser.urlencoded({ extended: false }))
//解析json参数
app.use(bodyParser.json())

app.post('/abc',(req,res)=>{
    console.log(req.body)
    //告诉客户端我收到的参数
    res.send(req.body)
})

app.post('/efg',(req,res)=>{
    console.log(req.body)
    //告诉客户端我收到的参数
    res.send(req.body)
})

//开启服务器
app.listen(3000, () => {
    console.log('success');
})

03-案例:图书管理后台

1652811977887.png

1.0-项目介绍

  • 1.了解Express搭建服务端项目的流程
    • a.导入express
    • b.创建服务器
    • c.配置中间件
    • d.路由
    • e.开启服务器
  • 2.了解服务端路由处理流程(路由:其实就是前端的接口文档)
    • 请求 : 获取客户端发送过来的参数
    • 处理: 增删改查数据库
    • 响应 :将数据库的操作结果返回给客户端

1.0-接口文档

1 图书列表

  • 接口URL: /api/getbooks
  • 调用方式: GET
  • 参数格式:
参数名称参数类型是否必选参数说明
idNumber图书Id
booknameString图书名称
authorString作者
publisherString出版社
  • 响应格式:
数据名称数据类型说明
statusNumber200 成功;500 失败;
msgString对 status 字段的详细说明
dataArray图书列表
+idNumber图书Id
+booknameString图书名称
+authorString作者
+publisherString出版社
  • 返回示例:
{
  "status": 200,
  "msg": "获取图书列表成功",
  "data": [
    { "id": 1, "bookname": "西游记", "author": "吴承恩", "publisher": "北京图书出版社" },
    { "id": 2, "bookname": "红楼梦", "author": "曹雪芹", "publisher": "上海图书出版社" },
    { "id": 3, "bookname": "三国演义", "author": "罗贯中", "publisher": "北京图书出版社" }
  ]
}

2 添加图书

  • 接口URL: /api/addbook
  • 调用方式: POST
  • 参数格式:
参数名称参数类型是否必选参数说明
booknameString图书名称
authorString作者
publisherString出版社
  • 响应格式:
数据名称数据类型说明
statusNumber201 添加成功;500 添加失败;
msgString对 status 字段的详细说明
  • 返回示例:
{
    "status": 201,
    "msg": "添加图书成功"
}

3 删除图书

  • 接口URL: /api/delbook
  • 调用方式: GET
  • 参数格式:
参数名称参数类型是否必选参数说明
idNumber图书Id
  • 响应格式:
数据名称数据类型说明
statusNumber200 删除成功;500 未指定要删除的图书Id;501 执行Sql报错;502 要删除的图书不存在;
msgString对 status 字段的详细说明
  • 返回示例:
{
    "status": 200,
    "msg": "删除图书成功!"
}

1.1-图书管理服务器开发

//1.导入模块
const express = require('express')

//2.创建服务器
let app = express()

//3.配置中间件

//3.1 托管静态资源
app.use(express.static('www'))

//3.2 配置body-parse中间件
//(1)导入中间件
let bodyParser = require('body-parser')
//(2)使用中间件
app.use(bodyParser.urlencoded({
    extended: false
}))
//解析json参数
app.use(bodyParser.json())

//3.3 导入操作json数据库的第三方模块
/* 这个文件是老师提前封装好的操作json文件数据库的一套API,只需要使用 */
const hero = require('./data/book.js')

app.get('/api/getbooks', (req, res) => {
    //查询数据库
    hero.getbooks((err, data) => {
        if (err) {
            throw err
        } else {
            console.log(data)
            //服务器从数据库获得数据之后,需要添加一些状态码一起响应给客户端
            res.send({
                status:200,
                msg:'获取图书成功',
                data:data.books
            })
        }
    })
})

app.post('/api/addbook', (req, res) => {
    //1.获取body参数
    let body = req.body;
    console.log(body);
    
    //2.添加到数据库
    hero.addbook(body, (err) => {
        //3.响应客户端处理结果 (err_code:0 成功  err_code:500失败)
        if (err) {
            //数据库错误:响应500错误 服务器内部出错
            res.send({
                status: 500,
                message: err
            })
        } else {
            //告诉客户端添加成功
            res.send({
                status: 201,
                msg: '添加图书成功'
            })
        }
    })
})


app.get('/api/delbook', (req, res) => {
    //1.获取get请求参数
    let id = req.query.id;
    //2.处理:删除数据库
    hero.delete(id, (err) => {
        if (err) {
            throw err;
        } else {
            //3.响应:使用重定向技术刷新首页
            res.end(JSON.stringify({
                status: 200,
                msg: '删除图书成功'
            }))
        }
    })
})




//4.开启服务器
app.listen(3000, () => {
    console.log('success')
})