Node.js(3)-Express

43 阅读7分钟

EXpress - web开发框架

Express基本使用

1.安装

在项目所处的目录中,运行如下的终端命令,即可将 express 安装到项目中使用

npm i express@4.17.1

2. 创建基本的 Web 服务器

// 1.导入express
const express = require('express')

// 2.创建web服务器
const app = express()

//请求和路由都写在这里

// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,() => {
    console.log('express server running at hettp://127.0.0.1')
})

3. 监听 GET 请求

通过 app.get() 方法,可以监听客户端的 GET 请求,具体的语法格式如下

// 参数1:客户端请求的URL地址
// 参数2:请求对应的处理函数,req:请求对象。res:响应对象
app.get('请求URL',(req,res) => { // 处理函数 })
})

4. 监听 POST 请求

通过 app.post() 方法,可以监听客户端的 POST 请求,具体的语法格式如下

app.post('请求URL',(req,res) => {  //处理函数  })

5. 把内容响应给客户端

通过 res.send() 方法,可以把处理好的内容,发送给客户端

app.get('/user',(req,res) => {
    // 向客户端发送了JSON对象
    res.send({name:'zs' ,age:20,gender:'男'})
})

app.post('/user',(req,res) => {
    // 向客户发送文本内容
    res.send('请求成功')
})

6. 获取 URL 中携带的查询参数

通过 req.query 对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数

app.get('/',(req,res) => {
    // 默认情况下,req.query是一个空对象
    //客户端使用 ?name=zs&age=20 这种查询字符串形式,发送到服务器的参数
    //可以通过req.query对象访问到,例如:req.query.name  req.query.age
    console.log(req.query)
    res.send(req.query)
})

7. 获取 URL 中的动态参数

通过 req.params 对象,可以访问到 URL 中,通过 : 匹配到的动态参数:

//URL地址中,可以通过:参数名的形式,匹配动态参数值
// 注意:这里的 :id 是一个动态的参数
app.get('/user/:id/:username',(req,res)=>{
    // // req.params 默认也是一个空对象
    // 里面存放着通过 : 动态匹配到的 URL 参数,
    console.log(req.params)
    res.send(req.params)
})

Express路由

Express 中的路由分 3 部分组成,分别是请求的类型请求的 URL 地址处理函数,格式如下

app.method(path,handler)

1.最简单的写法

在 Express 中使用路由最简单的方式,就是把路由挂载到 app 上,示例代码如下:

const express = require('express') 
const app = express()

// 挂载路由
app.get('/',(req,res) => {
    res.send('Hello World.')
})
app.post('/',(req,res) => {
    res.send('Post Request.')
})

app.listen(80,() => {
    console.log('server running at http://127.0.0.1 ')
})

2. 模块化路由

为了方便对路由进行【模块化的管理】,Express 建议将路由直接挂载到 app 上,而是推荐将路由抽离单独的模块

【1】创建路由模块对应的 .js 文件

     ---`Router.js`文件

【2】调用 express.Router() 函数创建路由对象

【3】向路由对象上挂载具体的路由

【4】使用 module.exports 向外共享路由对象

var express = require('express')

// 【2】创建路由对象
var router = express.Router()

// 【3】挂载获取用户列表的路由
router.get('/user/list',function(req,res){
    res.send('Get user list.')
})
// 【3】挂载添加用户的路由
router.post('/user/add',function(req,res){
    res.send('Add newnuser')
})

// 【4】向外到处路由对象
module.exports = router

【5】在目标js页面中,使用 app.use() 函数注册路由模块

// 【1】导入路由模块
const router = require('./6Router')
// 【2】注册路由模块,为路由模块添加前缀
app.use(router)

【6】为路由模块添加前缀

类似于托管静态资源时,为静态资源统一挂载访问前缀一样,路由模块添加前缀的方式也非常简单

const express = require('express')
const app = express()

// 【1】导入路由模块
const router = require('./6Router')
// 【2】注册路由模块,为路由模块添加前缀
app.use('/api',router)

app.listen(80,() => {
    console.log('http://127.0.0.1')
})

Express中间件

1.定义简单中间件函数

const mv = (req,res,next)=>{
    console.log('这是一个最简单的中间件函数')
    //必须在最后调用next(),表示把流转关系转交给一个中间件或路由
    next()
}

2. 全局生效的中间件 和 其【简化模式】

客户端发起的任何请求,到达服务器之后,触发的中间件,叫做全局生效的中间件。 通过调用 app.use(中间件函数),即可定义一个全局生效的中间件

const mv = function(req,res,next){
    console.log('这是最简单的中间件函数')
    next()
}
// 定义全局生效的中间件
app.use(mv)

//【简化模式】
app.use(function(req,res,next){
    console.log('这是简单模式定义的全局中间件')
    next()
})

3. 局部生效的中间件

不使用 app.use() 定义的中间件,叫做局部生效的中间件

const express = require('express')
const app = express()

// 定义中间件函数
const mw1 = (req,res,next)=>{
    console.log('调用了局部生效的中间件')
    next()
}
// 创建路由
app.get('/', mw1,(req,res)=>{
    res.send('Home page.')
})
app.get('/user', (req,res)=>{
    res.send('User page.')
})
//只有'/'这个路由器可以使用中间件函数,'/user'不可以使用

app.listen(80,function(){
    console.log('Express server running at http://127.0.0.1 ')
})

4.错误级别的中间件

注意:错误级别的中间件,必须注册在所有路由

const express = require('express')
const app = express()

// 1.定义路由
app.get('/',(req,res)=>{
    // 认为的制造错误
    throw new Error('服务器内部发生了错误')
    res.send('Home page.')
})
// 2.定义错误级别的中间件,捕获整个项目的异常错误,防止程序的崩溃
app.use((err,req,res,next)=>{
    console.log('发生了错误!' + err.message)
    res.send('Error:' + err.message)
})

app.listen(80,function(){
    console.log('http://127.0.0.1')
})

5.第三方的中间件

例如:body-parser

  1. 运行 npm install body-parser 安装中间件
  2. 使用 require 导入中间件
  3. 调用 app.use() 注册并使用中间件
const express = require('express')
const app = express()

// 【导入】body-parser中间件
const parser = require('body-parser')
// 【使用】app.use()注册中间件
app.use(parser.urlencoded({extended:false}))

app.post('/user',(req,res)=>{
    // 如果没有配置任何解析表单数据的中间件,则 req.body 默认等于 undefined
    console.log(req.body)
    res.send('ok')
})

app.listen(80,()=>{
    console.log('http://127.0.0.1')
})

6.自定义中间件

  1. 定义中间件
  2. 监听 req 的 data 事件
  3. 监听 req 的 end 事件
  4. 使用 querystring 模块解析请求体数据
  5. 将解析出来的数据对象挂载为 req.body
  6. 将自定义中间件封装为模块
// 导入querystring模板
const qs= require('querystring')

// 【1】定义解析表单数据的中间件
const bodyParser = (req,res,next)=>{
    // 【2】监听req的data事件
    let str = ''
    req.on('data',(chunk)=>{
        str += chunk
    })
    // 【3】监听req的end事件
    req.on('end',()=>{
        // console.log(str)
        // 【4】调用qs.parse()方法,把查询字符串解析为对象
        const body = qs.parse(str)
        // 【5】将解析出来的数据对象挂载为req.body
        req.body = body
        next()
    })
}
module.exports = bodyParser
const express = require('express')
const app = express()

// 1.导入自己封装的中间件模块
const customBodyParser = require('./19custon-body-parse')
// 2.将自定义的中间件函数,注册为全局可用的中间件
app.use(customBodyParser)

app.post('/user',(req,res)=>{
    res.send(req.body)
    console.log(req.body)
})

app.listen(80,()=>{
    console.log('http://127.0.0.1')
})

使用 Express 写接口

  1. 创建基本的服务器
  2. 创建 API 路由模块
  3. 编写 GET 接口
  4. 编写 POST 接口
  5. CORS 解决跨域
  6. 创建 JSONP 接口的注意事项(必须在配置 CORS 中间件之前)
//【 1.创建基本的服务器】
const express = require('express')
const app = express()

// 配置解析表单数据的中间件
app.use(express.urlencoded({extended:false}))

//【6.】 必须在配置 cors 中间件之前,配置 JSONP 的接口
app.get('/api/jsonp', (req, res) => {
    // TODO: 定义 JSONP 接口具体的实现过程
    // 1. 得到函数的名称
    const funcName = req.query.callback
    // 2. 定义要发送到客户端的数据对象
    const data = { name: 'zs', age: 22 }
    // 3. 拼接出一个函数的调用
    const scriptStr = `${funcName}(${JSON.stringify(data)})`
    // 4. 把拼接的字符串,响应给客户端
    res.send(scriptStr)
})

// 【5】一定要在路由之前,配置cors这个中间件,从而解决接口跨域的问题
const cors =require('cors')
app.use(cors())

// 【2】导入路由模块
const router = require('./21apiRouter')
app.use('/api',router)


app.listen(80,()=>{
    console.log('http://127.0.0.1')
})
// 【2.创建 API 路由模块】
const express = require('express')
const router = express.Router()

// 在这里挂载对应的路由
// 【3】定义 GET 接口
router.get('/get',(req,res)=>{
    // 通过req.query获取客户端通过查询字符串,发送到服务器的数据
    const query =req.query
    // 调用res.send()方法,向客户端响应处理的结果
    res.send({
        status:0, //0 表示处理成功, 1表示处理失败
        msg:'GET请求成功', //状态的描述
        data:query, //需要响应给客户端的数据
    })
})
// 【4】定义POST接口
router.post('/post',(req,res)=>{
    // 通过req.body获取请求体中包含的url-encoded格式的数据
    const body = req.body
    // 调用res.send()方法,向客户端响应结果
    res.send({
        status:0,
        msg:'POST请求成功',
        data:body,
    })
})

// 定义DELETE接口
router.delete('/delete',(req,res)=>{
    res.send({
        status:0,
        mag:'DELETE请求成功',
    })
})

module.exports = router