Express框架中_router 对象数据结构使用详解

Express框架中的router对象是用来处理HTTP请求的一种方式,它可以帮助我们更加方便地组织代码,同时支持模块化开发和版本控制等功能。在本篇攻略中,我们将详细讲解Express框架中router对象的数据结构和使用方法。

路由基础

在开始讲解router对象之前,我们首先需要了解一些基本的路由知识。Express中的路由由一个或多个HTTP方法(比如GET、POST等)、一个路径和一个或多个处理函数组成。处理函数是一个中间件函数,用来处理请求和响应。

以下是一个简单的路由示例:

app.get('/users/:userId', function (req, res) {
    res.send('userId: ' + req.params.userId);
});

该路由匹配以“/users/”开头的路径,同时要求路径中包含一个userId参数,比如“/users/123”。当访问这个路径时,处理函数将会返回“userId: 123”的响应。

router对象概述

router对象是Express中的一个中间件函数,我们可以将它看作是一个小型的应用程序,可以拥有自己的路由、中间件等。

下面是一个简单的router对象示例:

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

router.get('/users/:userId', function (req, res) {
    res.send('userId: ' + req.params.userId);
});

module.exports = router;

在上面的示例中,我们创建了一个名为router的对象,该对象包含一个以GET方法定义的路由。注意,我们使用了router.get()方法而不是app.get()方法。这是因为router对象只对应用程序范围内指定的路径和HTTP方法进行响应。

为了使用该router对象,我们需要在应用程序中进行引入:

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

在上面的例子中,我们使用了app.use()方法,将该router对象挂载到了“/users”路径上。当访问“/users/:userId”这个路径时,该router对象将会处理该请求,并返回相应的响应。

router对象数据结构

router对象支持多个路由和规则的组合,我们可以使用router对象的多种方法来定义和操作这些路由。下面是一些常用的router对象方法:

  • router.get(path, [callback...], callback)
  • router.post(path, [callback...], callback)
  • router.put(path, [callback...], callback)
  • router.delete(path, [callback...], callback)
  • router.use([path,] function [, function...])
  • router.param([name,] callback)
  • ...

其中,get、post、put和delete方法与前面的路由基础部分相同,可以用来定义相应的HTTP方法的路由。

use方法可以用来添加中间件或子路由,中间件是用来处理请求和响应的函数,子路由是一个具有全部HTTP方法的路由对象。

param方法用来在匹配路由之前处理指定参数,常用于参数校验或参数重命名。

下面是一个利用router对象构建简单API的示例代码:

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

router.get('/users', function (req, res) {
    // 返回所有用户信息
});

router.get('/users/:id', function (req, res) {
    // 返回指定id的用户信息
});

router.post('/users', function (req, res) {
    // 新增用户信息
});

router.patch('/users/:id', function (req, res) {
    // 更新指定id的用户信息
});

router.delete('/users/:id', function (req, res) {
    // 删除指定id的用户信息
});

module.exports = router;

在上面的代码中,我们创建了一个名为router的对象,并定义了多个路由。最后,我们通过module.exports将该对象导出,以便其他文件可以引入并使用它。

案例示例

下面是一个更加具体的案例示例:我们需要开发一个简单的API,用来展示电影和相关的信息。电影包含以下信息:电影名称、导演、演员、上映时间、简介等。我们需要使用Express框架来开发这个API,使用MySQL数据库来存储数据。

首先,我们需要创建一个名为moviesRouter的文件,用来存放我们的路由。在该文件中,我们需要编写以下代码:

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

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '123456',
    database: 'movies_db'
});

router.get('/movies', function (req, res) {
    connection.query('SELECT * FROM movies', function (error, results) {
        if (error) {
            console.log(error);
            res.status(500).send('Internal Server Error');
        } else {
            res.send(results);
        }
    });
});

router.get('/movies/:id', function (req, res) {
    const id = req.params.id;
    connection.query('SELECT * FROM movies WHERE id = ?', [id], function (error, results) {
        if (error) {
            console.log(error);
            res.status(500).send('Internal Server Error');
        } else {
            if (results.length === 0) {
                res.status(404).send('Not Found');
            } else {
                res.send(results[0]);
            }
        }
    });
});

router.post('/movies', function (req, res) {
    const { name, director, actors, release_date, description } = req.body;
    connection.query('INSERT INTO movies (name, director, actors, release_date, description) VALUES (?, ?, ?, ?, ?)', [name, director, actors, release_date, description], function (error, results) {
        if (error) {
            console.log(error);
            res.status(500).send('Internal Server Error');
        } else {
            res.status(201).send('Created');
        }
    });
});

router.patch('/movies/:id', function (req, res) {
    const id = req.params.id;
    const { name, director, actors, release_date, description } = req.body;
    connection.query('UPDATE movies SET name = ?, director = ?, actors = ?, release_date = ?, description = ? WHERE id = ?', [name, director, actors, release_date, description, id], function (error, results) {
        if (error) {
            console.log(error);
            res.status(500).send('Internal Server Error');
        } else {
            if (results.affectedRows === 0) {
                res.status(404).send('Not Found');
            } else {
                res.send('Updated');
            }
        }
    });
});

router.delete('/movies/:id', function (req, res) {
    const id = req.params.id;
    connection.query('DELETE FROM movies WHERE id = ?', [id], function (error, results) {
        if (error) {
            console.log(error);
            res.status(500).send('Internal Server Error');
        } else {
            if (results.affectedRows === 0) {
                res.status(404).send('Not Found');
            } else {
                res.send('Deleted');
            }
        }
    });
});

module.exports = router;

在上面的代码中,我们首先创建了一个名为connection的MySQL数据库连接。然后,我们编写了多个路由,用来处理电影的基本操作(如获取电影列表、获取指定电影的详细信息、新增电影等)。最后,我们将router对象通过module.exports导出。

在应用程序入口文件(如app.js或index.js)中,我们需要引入moviesRouter对象,并将它挂载到一个特定的路径(如“/api”)下。以下是示例代码:

const express = require('express');
const bodyParser = require('body-parser');
const moviesRouter = require('./moviesRouter');

const app = express();
app.use(bodyParser.json());
app.use('/api', moviesRouter);

app.listen(3000, function () {
    console.log('Server started on port 3000');
});

在上面的代码中,我们首先引入moviesRouter对象,并通过app.use()方法将它挂载到了“/api”路径下。然后,我们启动了一个端口号为3000的服务器。

现在,我们就可以通过HTTP请求来访问我们的API了。例如,我们可以使用以下命令来获取电影列表:

curl http://localhost:3000/api/movies

当然,我们也可以使用其他工具(如Postman或Insomnia)来管理HTTP请求,并查看响应结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Express框架中_router 对象数据结构使用详解 - Python技术站

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

相关文章

  • shell获取目录下所有文件夹的名称并输出的实例

    要获取指定目录下的所有文件夹名称,可以借助shell中的一些命令和工具进行实现。下面是一个完整攻略,包括脚本编写和示例说明。 1. 使用ls和grep命令获取文件夹名称列表 下面是一个简单的示例脚本,它将使用ls和grep命令获取指定目录下的所有文件夹名称列表,并输出到终端中: #!/bin/bash # 设置要获取名称的目录 directory=&quot…

    other 2023年6月26日
    00
  • Android自定义标尺滑动选择值效果

    接下来我将为你详细讲解如何实现Android自定义标尺滑动选择值效果。 1. 概述 在Android开发中,我们经常需要使用到一些具有特定样式的滑动控件,例如标尺滑动选择值控件。而在实现这样的控件时,最简单的方法就是使用已有的控件,并对其进行自定义。 2. 准备工作 我们首先需要创建一个自定义控件类,例如RulerSeekBar,继承自SeekBar。接下来…

    other 2023年6月25日
    00
  • 科普知识:Windows下的Program Files (x86)文件夹是干什么的?

    科普知识:Windows下的Program Files (x86)文件夹是干什么的? 在Windows操作系统中,Program Files (x86)文件夹是一个特殊的文件夹,用于存储32位应用程序的安装文件和相关数据。下面将详细解释这个文件夹的作用和示例说明。 作用 Program Files (x86)文件夹是为了兼容性而存在的。当64位版本的Wind…

    other 2023年7月28日
    00
  • 前端学习之javascript基础

    前端学习之JavaScript基础 JavaScript作为一门强大的编程语言,在前端开发中扮演着重要的角色。在学习前端开发的过程中,学习JavaScript是必不可少的一部分。本文将介绍JavaScript的基础知识,并提供一些资源和实践建议。 基础知识 变量及数据类型 在JavaScript中,可以使用var、let和const三个关键字来声明变量。其中…

    其他 2023年3月29日
    00
  • android中的matrix(矩阵)

    Android中的Matrix(矩阵) 在Android开发中,我们经常需要对UI进行各种变换,比如旋转、缩放、平移等。而Matrix的作用就是完成这些变换。 Matrix简介 Matrix,翻译为矩阵,是一个含有9个元素的数组对象,它是用来实现图形变换的重要工具。在Android中,我们可以通过Matrix来完成各种图形变换,比如平移、旋转、缩放、倾斜等操…

    其他 2023年3月29日
    00
  • MySQL通过实例化对象参数查询实例讲解

    MySQL是一个开源的关系型数据库管理系统,它由C和C++开发并广泛使用。在MySQL中,通过实例化对象参数查询是比较常用的方式之一。下面将为您提供MySQL通过实例化对象参数查询实例的完整攻略。 步骤一:创建数据库连接 在使用MySQL实例化对象进行查询之前,我们需要先创建一个数据库连接。创建数据库连接的步骤如下: import pymysql # 打开数…

    other 2023年6月27日
    00
  • Android自定义View圆形百分比控件(一)

    Android自定义View圆形百分比控件(一)攻略 简介 在本攻略中,我们将学习如何创建一个自定义的圆形百分比控件,用于显示一个圆形进度条,并根据百分比值进行动态更新。 步骤 步骤一:创建自定义View类 首先,我们需要创建一个自定义的View类,用于绘制圆形进度条。以下是一个示例代码: public class CircleProgressBar ext…

    other 2023年9月6日
    00
  • vmware网络设置详解

    VMware网络设置详解 在VMware虚拟机中,网络设置非常关键。正确的网络配置可以确保虚拟机与外部网络之间的通信正常,并能实现更多的功能。本文将详细介绍VMware网络设置的各种选项和配置,以帮助您更好地理解和配置VMware网络。 虚拟网络介绍 在VMware中,虚拟网络是连接虚拟机和外部网络的接口。VMware提供了三种不同类型的虚拟网络: 桥接模式…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部