从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)

相关推荐
惜.己5 小时前
Jmeter中的断言(二)
测试工具·jmeter·1024程序员节
西电研梦14 小时前
考研倒计时30天丨和西电一起向前!再向前!
人工智能·考研·1024程序员节·西电·西安电子科技大学
惜.己15 小时前
Jmeter中的断言(四)
测试工具·jmeter·1024程序员节
·云扬·1 天前
Java IO 与 BIO、NIO、AIO 详解
java·开发语言·笔记·学习·nio·1024程序员节
网安_秋刀鱼1 天前
PHP代码审计 --MVC模型开发框架&rce示例
开发语言·web安全·网络安全·php·mvc·1024程序员节
HUODUNYUN1 天前
小程序免备案:快速部署与优化的全攻略
服务器·网络·web安全·小程序·1024程序员节
惜.己2 天前
Jmeter的后置处理器(二)
测试工具·github·1024程序员节
惜.己2 天前
Jmeter中的断言(一)
测试工具·jmeter·1024程序员节
cainiao0806052 天前
《物理学进展》
1024程序员节·核心期刊·知网期刊·职称评审
FFDUST2 天前
C++ —— string类(上)
c语言·开发语言·数据结构·c++·stl·1024程序员节