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

文章目录

Express框架
1、初体验express
javascript 复制代码
// 导入express包
const express = require('express')

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

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

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

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

3、路由的使用
javascript 复制代码
// 导入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、获取请求参数
javascript 复制代码
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、电商项目商品详情场景配置路由占位符规则
javascript 复制代码
// 导入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参数返回对应歌手信息
javascript 复制代码
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模块设置响应体的一些方法
javascript 复制代码
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、其他响应设置
javascript 复制代码
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、定义全局中间件
javascript 复制代码
// 导入
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、定义路由中间件
javascript 复制代码
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、静态资源中间件
javascript 复制代码
// 静态资源中间件设置, public就是静态资源目录。配置以后不管任何文件格式,这个方法都会给我们配置好mime类型。
app.use(express.static(__dirname + '/public'))
9、获取请求体数据

要使用到一个中间件body-parser,这个中间件有两个方法

先安装中间件npm i body-parser

javascript 复制代码
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或者域名,从而阻止一些外部系统访问资源

javascript 复制代码
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文件存放路由

javascript 复制代码
const express = require('express')
// 创建路由对象
const router = express.Router()

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

// 暴露router
module.exports = router 

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

javascript 复制代码
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)

相关推荐
yaosheng_VALVE6 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king6 小时前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
一个通信老学姐5 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui5 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9266 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang20216 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒7 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang20217 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节
一个通信老学姐7 天前
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
earthzhang20218 天前
《深入浅出HTTPS》读书笔记(18):公开密钥算法RSA(续)
网络·网络协议·算法·https·1024程序员节