记录nodejs使用express搭建一个api服务器程序(4) 您所在的位置:网站首页 nodejs连接redis 记录nodejs使用express搭建一个api服务器程序(4)

记录nodejs使用express搭建一个api服务器程序(4)

2023-03-10 05:51| 来源: 网络整理| 查看: 265

此文章是我自己用来记录如何搭建一个以express为基础的api服务器框架的过程,并不是什么新手教程,并不会每一步都写得非常详细,如果您要阅读此文,需要一点nodejs和编写代码的基础知识

文接上篇 链接: 地址 https://blog.csdn.net/goodboy31985/article/details/106242299 在上文基础上,修改和完善api服务器的框架

Router api路由路径的配置 使用express.Router来匹配不同的路径匹配具体的路径处理函数分析路径上的参数

使用express.Router来匹配不同的路径

服务器需要处理不同的请求,通常不同的请求都是通过不同的路径来处理的,比如,要获取某个用户的信息,就是这个api http://xxx.xxx.x.x.x/api/users/1344 这样就可以获取到id为1344的用户的信息 或者是要获取所有书籍的目录,就是这个api http://xxx.xxx.x.x.x/api/books/all

服务器如何区分和匹配不同的路径,就可以通过Router来实现 我们在服务器的启动代码中 引入Router 在前几节中,我们已经创建了一个app,并且监听了某个端口,现在来创建路由 新建一个Routers.ts的文件,来统一管理我们的路由路径

// ApiServer/Routers.ts import express from "express"; export class Routers { apiRouter = express.Router(); PathRouter() { } }

注意,以上的代码并不完整,现在我们只是创建了一个路由,并未进行路径的匹配,PathRouter()方法暂时是空的

接下来,我们在ApiSever中使用它 我们首先创建了一个对象 router,并调用其PathRouter方法(此时此方法暂时为空),使用 this.app.use(’/api’,router.apiRouter) 语句,将所有以 /api 为开头的路径,全部由我们刚刚创建的路由对象来处理 现在其实我们还没有匹配任何的路径,接下来我们来匹配具体的路径

匹配具体的路径

现在我们在项目中增加一个文件夹和2个文件 Controller表示具体的事物处理类,真正执行具体的任务代码 Routers.ts来负责进行路径的分配 首先,我们来完善PathRouter

// ApiServer/Routers.ts import express from "express"; import { UserController } from "../Controller/UserController"; import { BookController } from "../Controller/BookController"; export class Routers { apiRouter = express.Router(); PathRouter() { // api/users/ this.apiRouter.get('/users/:id', UserController.UserInfo); // api/books/ this.apiRouter.get('/books/all',BookController.GetAllBooks) // api/orders/ //this.apiRouter.use('/orders') } }

PathRouter()中新增的这两行代码,就是具体的路径匹配了,其实完整的路径应该是 /api/users/xxxx,由于我们在ApiServer的代码中已经全局匹配了/api,所以这里的/api需要省略掉 这个语句中的第二个参数,就是对应的路径的处理函数(或者叫做中间件,我们现在的代码只有这1层中间件,实际中我们可以配置多个中间件,数据会被一层一层逐次处理,这部分内容在后面的文章中进行补充)

Controller/BookController.ts 的内容

// Controller/BookController.ts import { Request, Response, NextFunction } from 'express' export class BookController { // GET books/all static GetAllBooks(req: Request, res: Response, next: NextFunction) { console.log("receive a GET request"); console.log('[', req.method, '][', req.originalUrl, ']'); console.log(req.params); let books = [ { id: 1, name: "1" }, { id: 2, name: "2" }, { id: 3, name: "3" }, { id: 4, name: "4" }, ] return res.json(books).end(); } }

Controller/UserController.ts的内容

// Controller/UserController.ts import { Request, Response, NextFunction } from 'express' export class UserController { // GET users/:id static UserInfo(req: Request, res: Response,next:NextFunction) { let user = req.params; console.log("receive a GET request"); console.log('[', req.method, '][', req.originalUrl, ']'); console.log(req.params); return res.json(req.params).end(); } } 处理函数分析 // GET users/:id static UserInfo(req: Request, res: Response,next:NextFunction) { let user = req.params; console.log("receive a GET request"); console.log('[', req.method, '][', req.originalUrl, ']'); console.log(req.params); return res.json(req.params).end(); }

这个函数中有3个参数,req res 和 next req表示请求的信息,包括请求的来源,参数等等具体需要参考文档 链接: 链接 https://www.expressjs.com.cn/4x/api.html#req

res表示返回的数据 链接: 链接 https://www.expressjs.com.cn/4x/api.html#res

next表示下一个中间件,如果有多个中间件的话,可以调用next(),然后数据会交由下一个中间件处理

路径上的参数

通常有几种方式来传递请求的参数

http://x.x.x.x/api/users/:id/:age 这种方式,我们在客户端发起的请求地址是这样的 http://x.x.x.x/api/users/1/23 实际匹配的路径为 /api/users 后面的 /1/23 其实是参数 通过req.params 来获取 比如我现在运行我们刚刚的服务器代码 我们通过浏览器,向服务器发送get请求 输出的日志为 这里已经获取到参数 id:1 了 最后我将这个参数又返回给了客户端

http://x.x.x.x/api/users?id=1&age=23 这种方式,我们在客户端发起的请求地址是这样的 http://x.x.x.x/api/users?id=1&age=23 实际匹配的路径为 /api/users 后面的?id=1&age=23是参数 通过req.query 来获取 例如 处理这个请求 这里由于是通过?id=xxx 这样的形式传递的参数,通过req.params 无法获取到,需要通过req.query 来获取

通过post请求发送参数 这个在以后的文章中再讨论



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有