Express
认识express
- express是基于node.js,快速、开放、极简的web开发框架。
- 官网地址:https://www.expressjs.com.cn/
安装
$ mkdir myapp
$ cd myapp
$ npm init -y // 初始化项目
$ npm i express // 安装express
使用
- 创建服务
// 新建 app.js 文件,将其设置为入口文件(pachage.json文件的main属性配置)
// 引入express
const express = require('express')
// 创建一个服务
const app = express()
// 创建一个路由
app.get('/', (req, res) => {
// 返回响应
res.send('欢迎访问')
})
// 监听80端口
app.listen('80', () => {
console.log('服务已启动:http://127.0.0.1')
})
- 启动服务
$ node app.js
服务已启动:http://127.0.0.1
托管静态资源
// 托管静态资源
// 将public文件夹中的内容公开对外访问
// 注意:public不会出现在url中,因为Express会直接从静态目录中查找文件
app.use(express.static('public'))
// 可以为静态资源添加前缀地址
app.use('/public', express.static('public'))
// 可以同时托管多个静态文件
app.use(express.static('files'))
路由
- 简单路由:直接挂载到express实例上
// 简单路由:app.METHOD(PATH, HANDLER)
/*
app: 一个express实例
METHOD: 请求方法,
PATH: 路径,
HANDLER:路径匹配的处理函数
*/
app.get('/', (req, res) => {
res.send('欢迎访问')
})
// 路由参数(动态路由)
app.get('/users/:id', (req, res) => {
// 返回响应
res.send(req.params) // { id: '' }
})
- 模块化路由
// l路由模块 /router/index.js
const express = require('express')
// 创建一个路由实例
const router = express.Router()
// 新建路由
router.get('/about', (req, res) => {
res.send('模块化路由')
})
// 导出路由实例
module.exports = router
--------------------------------------------------------
// 引入express
const express = require('express')
// 创建一个服务
const app = express()
// 引入模块化路由
const router = require('./routes/index')
// 注册路由
app.use(router)
// 添加前缀
app.use('/module', router)
// 监听80端口
app.listen('80', () => {
console.log('服务已启动:http://127.0.0.1')
})
中间件
-
概念:中间件是在一个请求-响应的周期内,有权访问请求对象、响应对象和next()的一个函数。调用next()可以在当前中间件之后执行下一个中间件。
-
参数:中间件是一个函数,可以接受三个参数 req、res、next。
-
作用
- 执行任何代码
- 改变req和res(所有中间件共享同一个req res)
- 结束请求-响应周期(返回响应 res.send( ) )
- 执行下一个中间件( next( ) )
-
分类
- 应用级中间件:通过use( )和METHOD()绑定在Express实例上的中间件
// 应用级全局中间件 app.use((req, res, next) => { const date = new Date() console.log('time:', date.getTime()) next() }) // 应用级局部中间件 app.use('/users/: id', (req, res, next) => { console.log('time:', Date.now()) next() }) // 应用级中间件 app.get('/', (req, res, next) => { next() }) // 路由参数 app.get('/users/:id', (req, res) => { // 返回响应 res.send(req.params) })
- 路由级中间件:和应用级中间件的工作方式相同,区别就是将中间件绑定到路由实例上
// 路由级全局中间件 router.use((req, res, next) => { const date = new Date() console.log('time:', date.getTime()) next() }) // 路由级局部中间件 router.use('/users/: id', (req, res, next) => { console.log('time:', Date.now()) next() })
- 错误处理级中间件:四个参数err、req、res、next
app.use(function (err, req, res, next) { console.error(err.stack) res.status(500).send('Something broke!') })
- 内置中间件
// 托管静态资源 app.use(express.static()) // 解析请求体中的JSON格式 app.use(express.json()) // 解析urlencoded格式 app.use(express.urlencoded( extended: false))
- 第三方中间件
nodejs操作数据库
-
安装第三方模块mysql并引入项目中
-
连接数据库
-
通过mysql语句执行sql语句来操作数据库
// 1. 导入mysql模块 const mysql = require('mysql') // 2. 与数据库建立连接 const db = mysql.createPool({ host: '127.0.0.1', // 数据路的地址 user: 'root', // 登录数据库的账号 password: 'root', // 密码 database: 'zsl' // 操作的数据库名称 }) // 3. 测试连接 db.query('SELECT 1', (err, results) => { if (err) return console.log(err.message) console.log(results) }) // 4. 执行查询语句, 执行的结果results一个数组 db.query('SELECT * FROM user', (err, results) => { if (err) return console.log(err.message) console.log(results) }) // 5. 执行插入语句,执行的结果results一个对象 const user = { username: 'bb', password: '123344555'} const insertSql = 'INSERT INTO user (username, password) VALUES (?, ?)' db.query(insertSql, [user.username, user.password], (err, results) => { if (err) return console.log(err.message) if (results.affectedRows === 1) { console.log('插入成功') } }) // 5. 执行便捷插入语句 const user = { username: 'bb', password: '123344555' } const insertSql = 'INSERT INTO user set ?' db.query(insertSql, user, (err, results) => { if (err) return console.log(err.message) if (results.affectedRows === 1) { console.log('插入成功') } }) // 6. 执行更新语句,执行的结果results一个对象 const user = { id: 7, username: 'adda', password: '999999' } const sqlStr = 'UPDATE user SET username=?, password=? WHERE id=?' db.query(sqlStr, [user.username, user.password, user.id], (err, results) => { if (err) return console.log(err.message) if (results.affectedRows === 1) { console.log('更新成功') } }) // 6. 执行便捷更新语句 const user = { id: 7, username: 'acfg', password: '999999' } const sqlStr = 'UPDATE user SET ? WHERE id=?' db.query(sqlStr, [user, user.id], (err, results) => { if (err) return console.log(err.message) if (results.affectedRows === 1) { console.log('更新成功') } }) // 执行删除语句,执行的结果results一个对象 const sqlStr = 'DELETE FROM user WHERE id=?' db.query(sqlStr, 7, (err, results) => { if (err) return console.log(err.message) if (results.affectedRows === 1) { console.log('删除成功') } }) // delete会将表中的数据删除,一般不会使用。可以使用标记删除,通过更新数据的状态(一个字段)来表示数据的删除