nodejs express路由匹配控制及Router模块化使用详解

yizhihongxing

针对“nodejs express路由匹配控制及Router模块化使用详解”的完整攻略,我会分为以下几个方面进行详细说明:

  1. 路由匹配控制
  2. Router模块化使用
  3. 示例说明

1. 路由匹配控制

在Node.js的Express框架中,路由控制是指将请求映射到指定的路由处理函数(controller)上。

主要通过app对象的路由apr()方法将处理方法与路由匹配。

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

上述代码表示当访问网站根目录时,返回'Hello World!'

除了app.get()方法还有其他的请求方法,如app.post()、app.delete()、app.put()等。

在上述例子中,'/'是路由路径,(req, res) => {...}是路由处理函数。

路由路径可以是字符串、字符串模式、正则表达式,例如:

app.get('/about', (req, res) => {
  res.send('About Page')
})

app.get('/users/:id', (req, res) => {
  const id = req.params.id
  res.send(`User ${id}`)
})

app.get(/.*fly$/, (req, res) => {
  res.send('I am a butterfly')
})

2. Router模块化使用

在Express中,Route是指将相同前缀的路由放在一个Route对象下,来增加代码的可读性和维护性。在Route对象中,可以设置路由路径和路由处理函数。

要使用Route,需要通过Express.Router()创建一个Router实例,然后通过app.use()将路由器分配到特定路径上。

const express = require('express')
const app = express()
const router = express.Router()

router.get('/', (req, res) => {
  res.send('Home Page')
})

router.get('/about', (req, res) => {
  res.send('About Page')
})

router.get('/contact', (req, res) => {
  res.send('Contact Page')
})

app.use('/pages', router)

app.listen(3000, () => console.log('Server running on port 3000))

上述例子表示:

  • 创建了一个包含三个路由的Router实例,路由包含:'/'、'/about'、'/contact'
  • 通过app.use('/pages', router),将路由器分配到'/pages'路径下
  • 所有的'/pages'路由都指向Router实例

3. 示例说明

接下来,我通过两个示例来详细讲解一下路由匹配控制和Router模块化使用。

示例一

实现一个简单的博客系统,包含以下功能:

  • 首页(/):显示所有博客文章的列表
  • 博客文章详情页(/posts/:postId):显示对应postId的博客文章详情
  • 发布新博客(/posts/new):渲染一个包含表单的页面,用户可以填写博客文章的内容
  • 提交新博客(/posts):接收表单提交的数据,将博客文章保存在数据库中

首先,我们需要安装一些需要用到的依赖:

npm install express --save
npm install body-parser --save
npm install pug --save
npm install mongoose --save

接下来,创建一个文件夹,命名为blog,并在其中创建以下文件:

app.js // express 主文件
controllers // 注册控制器
  |-- post.js
  |-- home.js
middleware // 中间件
models // 注册数据库模型
routes // 注册路由
views // 视图
  |-- home.pug
  |-- post.pug
  |-- new_post.pug

app.js主文件内容如下:

const express = require('express')
const bodyParser = require('body-parser')
const mongoose = require('mongoose')

const app = express()

mongoose.Promise = global.Promise
mongoose.connect('mongodb://localhost:27017/blog', {
  useNewUrlParser: true,
  useUnifiedTopology: true
})

app.set('views', './views')
app.set('view engine', 'pug')

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))

app.use('/', require('./routes/home'))
app.use('/posts', require('./routes/post'))

app.listen(3000, () => {
  console.log('Server is running at http://localhost:3000')
})

home.js路由控制器内容如下:

const express = require('express')
const router = express.Router()
const Post = require('../models/post')

router.get('/', async (req, res) => {
  const posts = await Post.find().exec();
  res.render('home', {title: 'Home - Blog', posts: posts})
})

module.exports = router

post.js路由控制器内容如下:

const express = require('express')
const router = express.Router()
const Post = require('../models/post')

router.get('/:id', async (req, res) => {
  const post = await Post.findById(req.params.id).exec()
  res.render('post', {title: 'Post - Blog', post: post})
})

router.get('/new', (req, res) => {
  res.render('new_post', {title: 'New Post - Blog'})
})

router.post('/', async (req, res) => {
  const post = new Post({
    title: req.body.title,
    content: req.body.content
  })

  await post.save()

  res.redirect('/')
})

module.exports = router

home.pug内容如下:

html
  head
    title= title
  body
    h1= title
    a(href="/posts/new") Add New Post
    ul
      each post in posts
        li
          a(href="/posts/#{post.id}") #{post.title}

post.pug内容如下:

html
  head
    title= title
  body
    h1= post.title
    p= post.content

new_post.pug内容如下:

html
  head
    title= title
  body
    h1 New Post
    form(method='POST', action='/posts')
      label Title
      br
      input(type='text', name='title', required)
      br
      label Content
      br
      textarea(name='content', required)
      br
      button(type='submit') Create Post

示例二

实现一个基于Router模块化开发的REST API,包含以下功能:

  • 获取用户列表:GET /api/v1/users
  • 获取指定用户信息:GET /api/v1/users/:id
  • 创建新用户:POST /api/v1/users
  • 更新指定用户信息:PUT /api/v1/users/:id
  • 删除指定用户:DELETE /api/v1/users/:id

首先,我们需要安装一些需要用到的依赖:

npm install express --save
npm install body-parser --save

接下来,创建一个文件,命名为index.js,主要内容如下:

const express = require('express')
const bodyParser = require('body-parser')
const app = express()

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))

const usersRouter = require('./routes/users');
app.use('/api/v1/users', usersRouter);

app.listen(3000, () => console.log('App is running at http://localhost:3000'))

接下来,再创建一个文件夹,命名为routes,并在其中创建一个文件users.js,主要内容如下:

const express = require('express');
const router = express.Router();

const users = [
  {id:1, name: 'Tom', age: 18},
  {id:2, name: 'Jerry', age: 20},
  {id:3, name: 'Bob', age: 22}
]

router.get('/', (req, res) => {
  res.json(users)
})

router.get('/:id', (req, res) => {
  const id = Number(req.params.id);
  const user = users.find(user => user.id === id);

  if (user) {
    res.json(user)
  } else {
    res.status(404).json({ message: `User ${id} not found` });
  }
})

router.post('/', (req, res) => {
  const { name, age } = req.body;
  const newUserId = users.length + 1;
  const newUser = { id: newUserId, name, age };
  users.push(newUser);
  res.status(201).json(newUser)
})

router.put('/:id', (req, res) => {
  const id = Number(req.params.id);
  const user = users.find(user => user.id === id);

  if (user) {
    user.name = req.body.name;
    user.age = req.body.age;
    res.json(user);
  } else {
    res.status(404).json({ message: `User ${id} not found` });
  }
})

router.delete('/:id', (req, res) => {
  const id = Number(req.params.id);
  const userIndex = users.findIndex(user => user.id === id);

  if (userIndex !== -1) {
    users.splice(userIndex, 1);
    res.status(204).end();
  } else {
    res.status(404).json({ message: `User ${id} not found` });
  }
})

module.exports = router;

总结

通过本文的介绍,希望你能够了解完整的“nodejs express路由匹配控制及Router模块化使用详解”的攻略,掌握路由匹配控制和Router模块化使用的基本原理和实际应用。对于以上两个示例,你可以通过命令行运行,然后访问相应的路径体验一下。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs express路由匹配控制及Router模块化使用详解 - Python技术站

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

相关文章

  • nodejs之get/post请求的几种方式小结

    下面是“nodejs之get/post请求的几种方式小结”的完整攻略。 简介 在 Node.js 服务器中,我们经常需要处理来自客户端的 HTTP 请求,其中常见的请求方式有 GET 和 POST 请求。在本文中,我们将会向你展示如何使用 Node.js 处理 GET/POST 请求以及几种常用的方式。 处理 GET 请求 1. 使用 querystring…

    node js 2023年6月8日
    00
  • node.js 如何监视文件变化

    当我们在开发某个项目时,有时候需要实时监听某个文件或者文件夹的变化,比方说我们的样式文件、前后端模板文件、配置文件等等,这时候就需要用到 Node.js 提供的 fs 模块来实现文件的监视操作。 文件监视意味着,当文件或目录中的内容发生变化时,我们可以立即得到通知,从而进行相应的操作。Node.js 为此提供了 fs.watch() 和 fs.watchFi…

    node js 2023年6月8日
    00
  • nodejs中的express-jwt的使用解读

    下面就来详细讲解“nodejs中的express-jwt的使用解读”的完整攻略。 什么是express-jwt express-jwt是一个基于jwt(jsonwebtoken)认证的中间件,用于验证客户端发来的请求是否合法。 安装express-jwt 在终端中运行以下命令来安装express-jwt: npm install express-jwt 使用…

    node js 2023年6月8日
    00
  • Express框架之connect-flash详解

    当我们使用Express框架来构建Web应用时,我们会遇到一些需要在不同的HTTP响应间共享数据的情况,如用户登录后提示登录成功信息,或者在接收到用户提交表单后提示表单信息的验证结果等。为了解决这个问题,我们可以使用一个名为connect-flash的中间件。 本文将详细讲解如何使用connect-flash中间件来实现提示信息的传递和显示,并基于示例代码对…

    node js 2023年6月8日
    00
  • vue.js内置组件之keep-alive组件使用

    下面就是关于”vue.js内置组件之keep-alive组件使用”的详细讲解。 Keep-Alive组件的概述 Vue.js中内置了一个特殊的组件——Keep-Alive组件,它可以用来缓存具有状态的子组件,从而在下一次渲染时,可以直接使用已经渲染过的组件实例,而不需要重新渲染,以达到优化性能的效果。 这个组件可以将动态组件组织起来,缓存它们所对应的实例,以…

    node js 2023年6月8日
    00
  • Js中使用正则表达式验证输入是否有特殊字符

    Sure!以下是使用正则表达式验证输入是否有特殊字符的攻略: 步骤一:定义正则表达式 首先,定义一个RegExp对象来表示我们所需要的正则表达式。例如,我们希望限制输入只包含数字和字母,那么可以定义如下正则表达式: var reg = /^[a-zA-Z0-9]+$/; 在上述正则表达式中: /…/ 表示正则表达式的开始和结尾; ^ 表示匹配输入的开始位…

    node js 2023年6月8日
    00
  • node koa2 ssr项目搭建的方法步骤

    下面我将详细讲解“node koa2 ssr项目搭建的方法步骤”的完整攻略。 一、准备工作 在开始搭建SSR项目之前,需要确保本地环境已经包含了Node.js和npm工具。如果你的电脑上还没有安装这两个工具,可以到官网下载安装。 二、创建项目 创建一个项目文件夹 打开终端,进入你的工作目录,执行以下命令: mkdir ssr-project &&am…

    node js 2023年6月8日
    00
  • React和Node.js快速上传进度条功能实现

    React和Node.js快速上传进度条功能实现 上传文件的进度条功能是现代Web应用程序中的常见需求。本文将介绍如何使用React和Node.js创建一个快速上传进度条。 前置条件 在学习具体的实现前,你需要掌握以下技能和知识: 掌握React基础知识和操作; 掌握Node.js和Express框架的基础知识; 掌握使用axios发送http请求; 掌握使…

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