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

相关推荐
fangzhanpeng1684 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心6 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552712 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552713 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝14 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552714 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552715 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552717 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552717 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552718 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节