浅探express路由和中间件的实现

下面是“浅探express路由和中间件的实现”完整攻略:

1. 什么是路由

路由(router)是一种把 HTTP 请求对应到相应处理程序的技术。express.js 框架的路由系统是其核心功能之一,负责处理客户端请求并将其发送到相应的处理程序。express 中的路由器是一个中间件(listener)和一个处理程序(handler)的组合。

2. express路由的实现

在 Express 应用程序中创建路由的基本方法如下:

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

// 响应客户端GET请求
app.get('/path', (req, res) => {
  res.send('Hello World!')
})

// 响应客户端POST请求
app.post('/path', (req, res) => {
  res.send('Got a POST request')
})

// 响应客户端任何请求类型的请求
app.all('/path', (req, res) => {
  res.send('Got any request')
})

其中 app.getapp.post 是两种不同类型的路由,它们分别用于响应 GET 和 POST 请求。app.all 方法用于响应所有 HTTP 请求类型,可以用于注册中间件,如下所示:

app.all('/', (req, res, next) => {
  console.log('这是一个中间件。')
  next()
})

app.get('/path', (req, res) => {
  res.send('Hello World!')
})

3. express中间件的实现

在 Express 中,中间件是函数,它可以接收同一请求并产生不同的响应。可以利用中间件来处理 HTTP 请求并完成后续处理。常见的用途包括:

  • 执行身份验证
  • 处理请求和响应信息,如 body-parser
  • 处理静态资源
  • 处理文件上传

下面是一个简单的中间件示例:

app.use('/', (req, res, next) => {
  console.log('Time:', Date.now())
  next()
})

该中间件函数处理客户端请求,打印时间戳,然后通过调用 next() 函数将请求传递给下一层中间件处理。如果当前中间件没有调用 next() 函数,则请求将被终止。

4. 示例说明

下面是两个示例,分别介绍了如何使用路由和中间件。

示例一:使用路由实现一个 RESTful API

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

const books = [
  { id: 1, name: 'book1' },
  { id: 2, name: 'book2' },
  { id: 3, name: 'book3' }
]

// 获取图书列表
app.get('/api/books', (req, res) => {
  res.send(books)
})

// 根据 id 获取图书信息
app.get('/api/books/:id', (req, res) => {
  const book = books.find(b => b.id === parseInt(req.params.id))
  if (!book) return res.status(404).send('The book is not found.')
  res.send(book)
})

// 添加图书
app.post('/api/books', (req, res) => {
  const book = { id: books.length + 1, name: req.body.name }
  books.push(book)
  res.send(book)
})

// 更新图书信息
app.put('/api/books/:id', (req, res) => {
  const book = books.find(b => b.id === parseInt(req.params.id))
  if (!book) return res.status(404).send('The book is not found.')
  book.name = req.body.name
  res.send(book)
})

// 删除图书
app.delete('/api/books/:id', (req, res) => {
  const book = books.find(b => b.id === parseInt(req.params.id))
  if (!book) return res.status(404).send('The book is not found.')
  const index = books.indexOf(book)
  books.splice(index, 1)
  res.send(book)
})

app.listen(3000, () => {
  console.log('Server listening on port 3000.')
})

该示例使用了不同类型的路由来实现一个 RESTful API。GET 方法用于获取资源;POST 方法用于创建资源;PUT 方法用于更新资源;DELETE 方法用于删除资源。

示例二:使用中间件处理请求

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

// 日志中间件
app.use((req, res, next) => {
  console.log(req.method, req.url)
  next()
})

// 鉴权中间件
app.use('/api', (req, res, next) => {
  const token = req.headers['authorization']
  if (!token) return res.status(401).send('You are not authorized.')
  next()
})

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.get('/api/users', (req, res) => {
  res.send('User list.')
})

app.listen(3000, () => {
  console.log('Server listening on port 3000.')
})

在该示例中,第一个中间件是日志中间件,用于记录请求的方法和 URL 地址;第二个中间件是鉴权中间件,用于判断请求头部是否包含了 authorization 字段。对于所有以 /api 开头的请求,都需要通过鉴权中间件的验证才能继续进行下一步操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅探express路由和中间件的实现 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • JavaScript可否多线程? 深入理解JavaScript定时机制

    JavaScript可否多线程? JavaScript在浏览器中是单线程执行的,也就是说在同一时间只能执行一个任务。这是因为JavaScript引擎本身是单线程的,同时JavaScript操作DOM等浏览器API也会产生很多问题。这样做的好处是可以避免竞态条件,简化了代码实现,但也导致了JavaScript的同步执行模式下易受阻塞影响,长时间的脚本执行会导致…

    node js 2023年6月8日
    00
  • Node之简单的前后端交互(实例讲解)

    首先回顾一下这篇文章的主要内容。它主要是讲解如何使用Node.js实现前后端交互的过程,具体内容包括: 开启本地服务器,使用Node.js实现对于前端页面的请求响应 在前端页面中使用ajax发送请求,获取后端服务器响应数据 使用ejs模板引擎渲染动态页面 下面我们分别来详细介绍这三部分内容。 开启本地服务器 我们在Node.js中使用http模块创建一个本地…

    node js 2023年6月8日
    00
  • 基于JS实现一个小型编译器

    以下是基于JS实现一个小型编译器的完整攻略,主要分为以下几个步骤: 1. 定义语法规则 在实现编译器前,我们需要定义一套自己的语法规则。在本次示例中,我们定义一个类似于计算器的语法规则,包含四则运算、括号和变量赋值等功能。 program ::= statement* statement ::= expression | assignment express…

    node js 2023年6月8日
    00
  • node-sass@4.14.1报错的最终解决方案分享

    下面是关于“node-sass@4.14.1报错的最终解决方案分享”的完整攻略: 背景 首先,我们需要了解背景。node-sass是一个常用的将SCSS预处理器编译为CSS的工具,但在使用过程中,有些用户报告了“node-sass@4.14.1报错”的问题,原因是由于该版本的node-sass包是使用了一个已经被废弃的依赖项(libsass库)。这导致了编译…

    node js 2023年6月8日
    00
  • node实现爬虫的几种简易方式

    Node实现爬虫的几种简易方式 在Node中,我们可以利用一些开源的爬虫框架或者自己编写代码来实现爬虫。 1. 使用开源爬虫框架 1.1 Cheerio + Request Cheerio是服务端的jQuery实现,可以将HTML文件转化为Dom对象。Request是一个可以搭建HTTP请求的库。这两个库结合起来可以实现简单的网页爬取。 以下代码实现了爬取百…

    node js 2023年6月8日
    00
  • Node.js 使用递归实现遍历文件夹中所有文件

    下面是如何使用 Node.js 递归实现遍历文件夹中所有文件的完整攻略。 需要用到的 Node.js 模块 首先,我们需要 Node.js 来处理文件系统的操作,需要两个核心模块: fs模块 :用于访问文件系统。 path 模块:用于处理文件路径的工具。 因此,我们在开始之前需要先引入这两个模块。 const fs = require(‘fs’); cons…

    node js 2023年6月8日
    00
  • node 标准输入流和输出流代码实例

    下面是node标准输入流和输出流的详细讲解和代码实例攻略: 1. 标准输入流 标准输入流是指程序从控制台获取输入的数据流,通常使用process.stdin来读取。下面我们通过一个示例说明如何使用标准输入流来获取用户输入的数据: // 读取输入 process.stdin.resume(); process.stdin.setEncoding(‘utf8’)…

    node js 2023年6月8日
    00
  • JavaScript中Map与Object应用场景

    在JavaScript中,Map与Object都可以用于存储键/值对,但是它们在应用场景上的区别较大。 Map 什么是Map Map是一种新的数据结构,它于ES6(ECMAScript 2015)中被引入,主要用于存储键/值对,并且键和值可以是任意类型。它提供了以下主要方法: set(key, value) :向Map对象中添加或更新一个键值对。 get(k…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部