千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:成都千锋IT培训  >  技术干货  >  JavaScript全解析——express

JavaScript全解析——express

来源:千锋教育
发布人:gxy
时间: 2023-05-12 15:52:00

  express 的基本使用

express 的基本使用

  ●express 是什么?

  ○是一个 node 的第三方开发框架

  ■把启动服务器包括操作的一系列内容进行的完整的封装

  ■在使用之前, 需要下载第三方

  ■指令: npm install express

  1.基本搭建

 // 0. 下载: npm install express

  // 0. 导入

  const express = express();

  // 1. 创建服务器

  const server = express();

  // 2. 给服务器配置监听端口号

  server.listen(8080, () => {

  console.log("服务器启动成功");

  });

     2.配置静态资源

  a.之前:

  i.约定:

  1.所有静态资源以 /static 开头

  2.按照后面给出的文件名自己去组装的路径

  ii.组装:

  1.准备了初始目录 './client/'

  2.按照后缀去添加二级目录

  3.按照文件名去查找内容

  iii.例子: /static/index.html

  1.自动去 './client/views/index.html'

  b.现在:

  i.约定:

  1.所有静态资源以 /static 开头

  2.按照 /static 后面的路径去访问指定文件

  3.要求: 在 /static 以后的内容需要按照 二级路径的正确方式书写

  a. 假设你需要请求的是 './client/views/index.html' 文件

  b.你的请求地址需要书写 '/static/views/index.html'

  c.语法:

  i. express.static('开放的静态目录地址')

  ii.server.use('访问这个地址的时候', 去到开放的静态目录地址)// 0. 下载: npm install express

 // 0. 导入

  // 1. 创建服务器

  // 1.1 配置静态资源

  server.use("/static", express.static("./client/"));

  // 2. 给服务器配置监听端口号

      3.配置接口服务器

// 0. 下载: npm install express

  // 0. 导入

  // 1. 创建服务器

  // 1.1 配置静态资源

  // 1.2 配置服务器接口

  server.get("/goods/list", (req, res) => {

  /**

  * req(request): 本次请求的相关信息

  * res(response): 本次响应的相关信息

  *

  * req.query: 对 GET 请求体请求参数的解析

  * 如果有参数, req.query 就是 {a:xxx, b:yyy}

  * 如果没有参数, req.query 就是 {}

  */


  console.log(req.query);

  // res.end(JSON.stringify({code: 1, msg: '成功'}))

  res.send({ code: 1, msg: "成功" });

  });

  server.post("/users/login", (req, res) => {

  console.log(req.query);

  // 注意! express 不会自动解析 post 请求的 请求体

  res.send({

  code: 1,

  msg: "接收 POST 请求成功, 但是还没有解析请求体, 参数暂时不能带回",

  });

  });

  // 2. 给服务器配置监听端口号

      express 的路由

  ●express 提供了一个方法能够让我们制作一张 "路由表"

  ●目的就是为了帮助我们简化 服务器index.js 内部的代码量

  ●服务器根目录/router/goods.js

 // 专门存放于 goods 相关的路由表

  const express = require("express");

  // 创建一个路由表

  const Router = express.Router();

  // 向表上添加内容, 添加内容的语法, 向服务上添加的语法一样

  Router.get("/info", (req, res) => {

  res.send({

  code: 1,

  message: "您请求 /goods/list 成功",

  });

  });

  // 导出当前路由表

  module.exports.goodsRouter = Router

      ●服务器根目录/router/index.js

 const express = require("express");

  // 0. 导入处理函数

  const { goodsRouter } = require("./goods");

  // 创建路由总表

  const Router = express.Router();

  // 向路由总表上添加路由分表

  Router.use("/goods", goodsRouter);

  // 导出路由总表

  module.exports = Router

  复制代码

  ●服务器根目录/index.js

  // 0. 下载并导入 express

  const express = require("express");

  const router = require("./router"); // 相当于 ./router/index.js

  // 1. 创建服务器

  const server = express();

  // 1.1 配置静态资源

  server.use("/static", express.static("./client"));

  // 1.2 配置接口

  server.use("/api", router);

  // 2. 给服务器监听端口号

  server.listen(8080, () => {

  console.log("服务启动成功, 端口号8080~~~");

  });

      express 的中间件

  ●概念

  ○在任意两个环节之间添加的一个环节, 就叫做中间件

  ●分类

  ○全局中间件

  ■语法: server.use(以什么开头, 函数)

  ●server: 创建的服务器, 一个变量而已

  ●以什么开头: 可以不写, 写的话需要是字符串

  ●函数: 你这个中间件需要做什么事

// 0. 下载并导入第三方模块

  const express = require("express");

  // 0. 引入路由总表

  const router = require("./router");

  // 0. 引入内置的 fs 模块

  const fs = require("fs");

  // 1. 开启服务器

  const app = express();

  // 1.1 开启静态资源

  app.use("/static", express.static("./client/"));

  // 1.2 添加一个 中间件, 让所有请求进来的时候, 记录一下时间与请求地址

  app.use(function (req, res, next) {

  fs.appendFile("./index.txt", `${new Date()} --- ${req.url} \n`, () => {});

  next(); // 运行完毕后, 去到下一个中间件

  });

  // 1.3 开启路由表

  app.use("/api", router);

  // 2. 给服务添加监听

  app.listen(8080, () => console.log("服务器开启成功, 端口号8080~"));

     ○路由级中间件

  ■语法: router.use(以什么开头, 函数)

  ●router: 创建的路由表, 一个变量而已

  ●以什么开头: 可以不写, 写的话需要是字符串

  ●函数: 你这个中间件需要做什么事

 // 路由分表

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

  // 导入 cart 中间件

  const cartMidd = require("../middleware/cart");

  // 添加路由级中间件

  router.use(function (req, res, next) {

  /**

  * 1. 验证 token 存在并且没有过期才可以

  * 规定: 请求头内必须有 authorization 字段携带 token 信息

  */


  const token = req.headers.authorization;

  if (!token) {

  res.send({

  code: 0,

  msg: "没有 token, 不能进行 该操作",

  });

  }

  next();

  });

  router.get("/list", cartMidd.cartlist, (req, res) => {

  res.send({

  code: 1,

  msg: "请求 /cart/list 接口成功",

  });

  });

  router.get("/add", (req, res) => {

  res.send({

  code: 1,

  msg: "请求 /cart/add 接口成功",

  });

  });

  module.exports.cartRouter = router;

     ○请求级中间件

  ■直接在请求路由上, 在路由处理函数之前书写函数即可

 // 路由分表

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

  // 导入 cart 中间件

  const cartMidd = require("../middleware/cart");

  router.get("/list", cartMidd.cartlist, (req, res) => {

  res.send({

  code: 1,

  msg: "请求 /cart/list 接口成功",

  });

  });

  router.get("/add", (req, res) => {

  res.send({

  code: 1,

  msg: "请求 /cart/add 接口成功",

  });

  });

  module.exports.cartRouter = router;

  // ../middleware/cart.js

  const cartlist = (req, res, next) => {

  // 1. 判断参数是否传递

  const { current, pagesize } = req.query;

  if (!current || !pagesize) {

  res.send({

  code: 0,

  msg: "参数current或者参数pagesize没有传递",

  });

  return;

  }

  if (isNaN(current) || isNaN(pagesize)) {

  res.send({

  code: 0,

  msg: "参数current或者参数pagesize 不是 数字类型的, 请处理",

  });

  return;

  }

  next();

  };

  module.exports.cartlist = cartlist

      ○错误中间件

  ■本质上就是一个全局中间件, 只不过处理的内容

 // 0. 下载并导入第三方模块

  const express = require("express");

  // 0. 引入路由总表

  const router = require("./router");

  // 0. 引入内置的 fs 模块

  const fs = require("fs");

  // 1. 开启服务器

  const app = express();

  // 1.1 开启静态资源

  app.use("/static", express.static("./client/"));

  // 1.2 开启路由表

  app.use("/api", router);

  // 1.3 注册全局错误中间件(必须接收四个参数)

  app.use(function (err, req, res, next) {

  if (err === 2) {

  res.send({

  code: 0,

  msg: "参数current或者参数pagesize没有传递",

  });

  } else if (err === 3) {

  res.send({

  code: 0,

  msg: "参数current或者参数pagesize 不是 数字类型的, 请处理",

  });

  } else if (err === 4) {

  res.send({

  code: 0,

  msg: "没有 token, 不能进行 该操作",

  });

  }

  });

  // 2. 给服务添加监听

  app.listen(8080, () => console.log("服务器开启成功, 端口号8080~"));

  /*

  * 4. 错误中间件

  * 为了统一进行错误处理

  *

  * 例子:

  * 接口参数少

  * 请求 /goods/list 参数少

  * 请求 /cart/list 参数少

  * 请求 /news/list 参数少

  * res.send({code: 0, msg: '参数数量不对'})

  * 接口参数格式不对

  * 请求 /users/login 格式不对

  * 请求 /goods/list 格式不对

  * res.send({code: 0, msg: '参数格式不对})

  *

  * 思考:

  * 正确的时候, 直接返回结果给前端

  * 只要出现了错误, 统一回到全局路径上

  *

  * 操作:

  * 当你在任何一个环节的中间件内

  * => 调用 next() 的时候, 表示的都是去到下一个环节

  * => 调用 next(参数) 的时候, 表示去到的都是全局错误环节

  * 参数:

  * 参数的传递需要自己和自己约定一些暗号

  * 2: 表示 接口参数少

  * 3: 表示 接口参数格式不对

  * 4: 表示没有token

  * 5: XXXX....

  */

      token 的使用

  ●token 的使用分为两步

  ○加密

  ■比如用户登陆成功后, 将一段信息加密生成一段 token, 然后返回给前端

  ○解密

  ■比如用户需要访问一些需要登陆后才能访问的接口, 就可以把登录时返回的token保存下来

  ■在访问这些接口时, 携带上token即可

  ■而我们接收到token后, 需要解密token, 验证是否为正确的 token 或者 过期的 token

  1.加密

 /**

  * 使用一个 第三方包 jsonwebtoken

  */


  const jwt = require("jsonwebtoken");

  /**

  * 1. 加密

  * 语法: jwt.sign(你要存储的信息, '密钥', {配置信息})

  */


  const info = { id: 1, nickname: "肠旺面" };

  const token = jwt.sign(info, "XXX", { expiresIn: 60 });

  // console.log(token);

  /*

  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

  eyJpZCI6MSwibmlja25hbWUiOiLogqDml7rpnaLliqDnjKrohJoiLCJpYXQiOjE2NzAxNTYwMDgsImV4cCI6MTY3MDE1NjA2OH0.

  12-87hSrMYmpwXRMuYAbf08G7RDSXM2rEI49jaK5wMw

  */

   2.解密

jwt.verify(token, "XXX", (err, data) => {

  if (err) return console.log(err); // JsonWebTokenError: invalid signature

  console.log(data);

  });

 

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

JavaScript全解析——express

2023-05-12

java权限框架有哪些

2023-04-26

简单谈谈微信小程序

2023-04-20

最新文章NEW

volatile底层实现原理

2023-05-04

java怎么判断一个数据是什么类型

2023-04-27

xml解析器

2023-04-21

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>