当前位置: 首页 > article >正文

从0到1学习node.js(express模块)

文章目录

        • Express框架
          • 1、初体验express
          • 2、什么是路由
          • 3、路由的使用
          • 3、获取请求参数
          • 4、电商项目商品详情场景配置路由占位符规则
          • 5、小练习,根据id参数返回对应歌手信息
          • 6、express和原生http模块设置响应体的一些方法
          • 7、其他响应设置
          • 8、express中间件
            • 8.1、什么是中间件
            • 8.2、中间件的作用
            • 8.3、中间件的类型
            • 8.4、定义全局中间件
            • 8.5、定义路由中间件
            • 8.6、静态资源中间件
          • 9、获取请求体数据
          • 10、防盗链的实现
          • 11、路由的模块化

Express框架
1、初体验express
// 导入express包
const express = require('express')

// 创建应用对象
const app = express()

// 创建路由
app.get('/home', (req, res) => {
    res.end('hello express')
})

// 启动服务监听端口
app.listen(3000, ()=>{
    console.log('服务启动成功。。。')
})
2、什么是路由

官方定义:路由确定了应用程序如何响应客户端对特定端点的请求

3、路由的使用
// 导入express包
const express = require('express')

// 创建应用对象
const app = express()

// 创建路由
app.get('/home', (req, res) => {
    res.end('hello express')
})

// 创建路由
app.post('/login', (req, res) => {
    res.end('login')
})

// 匹配全部
app.all('/all', (req, res) => {
    res.end('all')
})

// 全都匹配不上就走这里
app.all('*', (req, res) => {
    res.end('Not Found 404')
})

// 启动服务监听端口
app.listen(3000, ()=>{
    console.log('服务启动成功。。。')
})
3、获取请求参数
const express = require('express')

// 创建应用对象
const app = express()

app.get('/request', (req, res) => {
    // http模块方法
    console.log('原生获取url         ', req.url)
    console.log('原生获取请求方式     ', req.method)
    console.log('原生获取http版本号   ',req.httpVersion)
    console.log('原生获取headers     ',req.headers)
    // express 封装的方法
    console.log('express获取url      ', req.path)
    console.log('express获取请求参数  ',req.query);
    // 获取ip地址
    console.log('express获取ip地址    ', req.ip);
    // 获取指定headers中的内容
    console.log('express获取指定header',req.get('host'))

    res.setHeader('content-type', 'text/html;charset=utf-8')
    res.end('请求成功!')
})

app.listen(3000, () => {
    console.log('服务启动成功,监听端口3000')
})

在这里插入图片描述

在这里插入图片描述

4、电商项目商品详情场景配置路由占位符规则
// 导入express模块
const express = require('express')
// 创建应用对象
const app = express()

// 创建路由
// :id占位符,所有这种格式的请求都会进入这里
app.get('/:id.html', (req, res) => {
    // params上存储所有的请求参数,id就是路由中的id,字段名必须一致才能取出来
    console.log(req.params.id)
    res.setHeader('content-type', 'text/html;charset=utf-8')
    res.end('商品详情')
})

// 启动服务
app.listen(3000, () => {
    console.log('服务启动成功,监听端口3000')
})
5、小练习,根据id参数返回对应歌手信息
const express = require('express')

const app = express()

const singers = [
    {
        name: '周杰伦',
        id: 1
    },
    {
        name: '许嵩',
        id: 2
    },
    {
        name: '汪苏泷',
        id: 3
    }
]
// 根据id返回指定数据
app.get('/:id.html', (req, res) => {
    const data = singers.filter(item => item.id == req.params.id)
    console.log(data)
    if (data.length == 0) {
        res.statusCode = 404
        res.end('<h1>404 Not Found</h1>')
        return
    }
    res.setHeader('content-type', 'text/html;charset=utf-8')
    res.end(JSON.stringify(data[0]))
})

app.listen(3000, () => {
    console.log('服务启动成功')
})
6、express和原生http模块设置响应体的一些方法
const express = require('express')

const app = express()

app.get('/response', (req, res) => {
    // 原生方法
    // 修改状态码
    res.statusCode = 404
    res.statusMessage = 'abcd'
    // 设置响应头
    res.setHeader('111', '222')
    // 设置响应体
    res.write('hello express')
    res.end('response')

    // express 方法
    res.status(500)
    res.set('aaa','bbb')
    res.send('你好 我是send') // 使用send会自动配置响应头Content-Type:text/html; charset=utf-8,中文不乱码
    res.status(500).set('aaa','bbb').send('你好 我是send') // 可以链式调用
})

app.listen(3000, () => {
    console.log('服务启动成功')
})
7、其他响应设置
const express = require('express')

const app = express()

app.get('/other', (req, res) => {
    // 重定向
    res.redirect('http://www.baidu.com')
    // 下载
    res.download(__dirname + '/index.js')
    // JSON响应
    res.json({
        name:'你好'
    })
    // 响应文件内容
    res.sendFile(__dirname + './text.html')
})

app.listen(3000, () => {
    console.log('服务启动成功')
})
8、express中间件
8.1、什么是中间件

中间件本质是一个回调函数
中间件函数可以像路由回调一样访问请求对象(request),响应对象(response)

8.2、中间件的作用

中间件的作用就是使用函数封装公共操作,简化代码

8.3、中间件的类型
  • 全局中间件
  • 路由中间件
8.4、定义全局中间件
// 导入
const express = require('express')
const fs = require('fs')
const path = require('path')

const app = express()

// 声明中间件函数,共有三个参数,请求报文。响应报文。和next函数
// next()函数如果后续有代码执行,必须调用。
function recordMiddleware(req, res, next) {
    // 获取url和IP地址
    let { url, ip } = req
    fs.appendFileSync(path.resolve(__dirname, './access.log'), `ip${ip}访问了${url}\r\n`)
    next()
}

// 使用中间件函数
app.use(recordMiddleware)

app.get('/home', (req, res) => {
    res.send('前台首页')
})

app.get('/admin', (req, res) => {
    res.send('后台首页')
})

app.all('*', (req, res) => {
    res.send('<h1>404 Not Found</h1>')
})

app.listen(3000, () => {
    console.log('服务启动成功')
})
8.5、定义路由中间件
const express = require('express')

// 创建应用对象
const app = express()

// 定义全局路由中间价函数
const checkCodeMiddleware = (req, res, next) => {
    let { code } = req.query
    if (code != '521') {
        res.send('暗号错误!')
        return
    }
    next()
}

// 可以全局注册也可以局部使用,直接在路由中调用
app.get('/home', checkCodeMiddleware, (req, res) => {
    res.send('前台页面')
})

app.get('/admin', (req, res) => {
    res.send('后台页面')
})

app.listen(3000, () => {
    console.log('服务启动成功...')
})
8.6、静态资源中间件
// 静态资源中间件设置, public就是静态资源目录。配置以后不管任何文件格式,这个方法都会给我们配置好mime类型。
app.use(express.static(__dirname + '/public'))
9、获取请求体数据

要使用到一个中间件body-parser,这个中间件有两个方法
先安装中间件npm i body-parser

const bodyParser = require('body-parser')
// 解析JSON格式的请求体的中间件
const jsonParser = bodyParser.json()
// 解析 querystring 格式请求体的中间件
const urlencodedParser = bodyParser.urlencoded({extended:false})

app.post('/login', urlencodedParser, (req,res)=>{
	// 调用这个中间件以后,会给req中添加一个body,就是请求参数
	const {username} = req.body
	res.send(username)
})
10、防盗链的实现

防盗链就是指一个网站的一些静态资源,通过判断请求头中的referer属性是否为本服务ip或者域名,从而阻止一些外部系统访问资源

const express = require('express')

const app = express()

// 静态资源中间价设置
app.use(express.static(__dirname + '/public'))

// 防盗链的原理主要是判断请求头中的referer 是否为自己服务的地址
const staticMiddleware = (req, res, next) => {
    // 检测请求头中的referer是否为 127.0.0.1
    // 获取referer
    let referer = req.get('referer')
    if (referer) {
        // 序列化referer
        let url = new URL(referer)
        let hostname = url.hostname
        console.log(hostname)
        if (hostname !== '127.0.0.1') {
            // 响应404
            res.status(404).send('<h1>404 Not Found</h1>')
        }
    }
    next()
}

app.use(staticMiddleware)

app.get('/login', (req, res) => {
    res.send('登录')
})

app.listen(3000, () => {
    console.log('服务启动成功...')
})
11、路由的模块化

创建一个routers目录。创建homeRouters.js文件存放路由

const express = require('express')
// 创建路由对象
const router = express.Router()

router.get('/admin', (req, res) => {
    res.send('后台管理')
})

// 暴露router
module.exports = router 

主要文件引入routers里面的文件,使用app.use挂载到app上

const express = require('express')
const homeRouters = require('./routers/home.js')
const adminRouters = require('./routers/admin.js')

const app = express()

app.use(homeRouters)
app.use(adminRouters)

app.all('*', (req, res) => {
    res.send('<h1>404 Not Found</h1>')
})

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

全部文章
从0到1学习node.js(fs模块)
从0到1学习node.js(path模块以及HTTP协议)
从0到1学习node.js(http模块)
从0到1学习node.js(npm)


http://www.kler.cn/news/363083.html

相关文章:

  • LeetCode题练习与总结:路径交叉--335
  • day7:软件包管理
  • 【经管】比特币与以太坊历史价格数据集(2014.1-2024.5)
  • 数据结构——广义表
  • 如何彻底销毁硬盘数据
  • Node.js 路由
  • Nginx+Tomcat 动静分离
  • NFC读写器web插件如果引用js文件
  • leetcode动态规划(十三)-目标和
  • 蓝牙资讯|iOS 18.1 正式版下周推送,AirPods Pro 2耳机将带来助听器功能
  • 分析软件工具——MATLAB综合实验(一)系统环境与运算基础
  • 笔记本使用虚拟机,使用Ubuntu打开摄像头
  • STM32传感器模块编程实践(十) 2.4G NRF24L01通信模块简介及驱动源码
  • elementUi el-table 表头高度异常问题
  • 使用openstack的救援功能对受损的oula系统云主机进行救援
  • word表格问题
  • MFC工控项目实例二十六创建数据库
  • 【Django】增加一个自定义字段
  • esxi开启嵌套虚拟化
  • 轻松上手 Disruptor:两个实例解析并发编程利器
  • AWS账号的费用结构与使用指南
  • Oracle分区表改造(一):通过数据导入迁移到新建分区表
  • 盘点2024年最受欢迎的开源GitOps工具
  • ClickHouse的特点与优势
  • C#/.NET/.NET Core技术前沿周刊 | 第 10 期(2024年10.14-10.20)
  • 认识maven