Express

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会将表中的数据删除,一般不会使用。可以使用标记删除,通过更新数据的状态(一个字段)来表示数据的删除
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值