当前位置:   article > 正文

【Express】实战 - 应用案例(二)- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API_express案例

express案例

文章目录

开源项目的地址
https://github.com/gothinkster/realworld
在这里插入图片描述
本文源码
https://github.com/yk2012/experss_demo/tree/master/realworld-api-express

视频
2021 最新最全 Express 教程(基础+实战+原理),B 站最好,没有之一

1. 项目初始化

1.1 创建项目

mkdir realworld-api-express
cd .\realworld-api-express\
npm init -y
npm i express
  • 1
  • 2
  • 3
  • 4

创建app.js

const express = require("express");

const app = express();

const PORT = process.env.PORT || 3000;

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

app.listen(PORT, () => {
   
  console.log(`Server is running at http://localhost:${
     PORT}`);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

启动app

nodemon app.js
  • 1

测试
在这里插入图片描述

1.2 目录结构

.
|-- config     # 配置文件
	|-- config.default.js
|-- controller # 用于解析用户的输入,处理后返回相应的结果
|-- model      # 数据持久层
|-- middleware # 用于编写中间件
|-- router     # 用于哦欸之URL路由规则
|-- util       # 工具模块
|-- app.js     # 用于自定义启动时的初始化工作
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

1.3 配置常用中间件

1.3.1 解析请求体 中间件

- express.json()
- express.urlencoded()
  • 1
  • 2
app.use(express.json())
app.use(express.urlencoded())
  • 1
  • 2

1.3.2 日志输出 中间件

- morgan()
  • 1
npm i morgan
  • 1

在这里插入图片描述

const morgan = require("morgan");

app.use(morgan("dev"));
  • 1
  • 2
  • 3

1.3.3 为客户端提供跨域资源请求 中间件

- cors()
  • 1
npm i cors
  • 1

在这里插入图片描述

const cors = require("cors");

app.use(cors());
  • 1
  • 2
  • 3

1.3.4 挂载测试中间件

app.js

const express = require("express");
const morgan = require("morgan");
const cors = require("cors");

const app = express();

app.use(morgan("dev"));
app.use(cors());
app.use(express.json());
app.use(express.urlencoded());

const PORT = process.env.PORT || 3000;

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

app.post("/", (req, res) => {
   
  console.log(req.body);
  res.send("Hello World");
});

app.listen(PORT, () => {
   
  console.log(`Server is running at http://localhost:${
     PORT}`);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

在这里插入图片描述
在这里插入图片描述

2. 路由设计

参照
https://github.com/gothinkster/realworld/tree/master/api

在这里插入图片描述
在这里插入图片描述

① app.js

const express = require("express");
const morgan = require("morgan");
const cors = require("cors");
const router = require("./router");

const app = express();

// 配置常用中间件
app.use(morgan("dev"));
app.use(cors());
app.use(express.json());
app.use(express.urlencoded());

const PORT = process.env.PORT || 3000;

// 挂载路由
app.use("/api", router);

app.listen(PORT, () => {
   
  console.log(`Server is running at http://loaclhost:${
     PORT}`);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

② index.js 路由

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

// 用户相关路由
router.use(require("./user"));

// 用户资料相关路由
router.use("/profiles", require("./profile"));

// 文章相关路由
router.use("/articles", require("./article"));

// 标签相关路由
router.use(require("./tag"));

module.exports = router;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

③ user.js 用户相关路由

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

// Authentication 用户登录
router.post("/users/login", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("post /users/login");
  } catch (err) {
   
    next(err);
  }
});

// Registration 用户注册
router.post("/users", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("post /users");
  } catch (err) {
   
    next(err);
  }
});

// Get Current User 获取当前登录用户
router.get("/user", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("get /user");
  } catch (err) {
   
    next(err);
  }
});

// Update User 更新用户
router.put("/user", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("put /user");
  } catch (err) {
   
    next(err);
  }
});

module.exports = router;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

④ profile.js 用户资料相关路由

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

// Get Profile 获取用户资料
router.get("/:username", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("get /profile/:username");
  } catch (err) {
   
    next(err);
  }
});

// Follow user 关注用户
router.post("/:username/follow", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("post /profile/:username/follow");
  } catch (err) {
   
    next(err);
  }
});

// Unfollow user 取消关注用户
router.delete("/:username/follow", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("delete /profile/:username/follow");
  } catch (err) {
   
    next(err);
  }
});

module.exports = router;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

⑤ article.js 文章相关路由

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

// List Articles
router.get("/", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("get /");
  } catch (err) {
   
    next(err);
  }
});

// Feed Articles
router.get("/feed", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("get /articles/feed");
  } catch (err) {
   
    next(err);
  }
});

// Get Article
router.get("/:slug", async (req, res, next) => {
   
  try {
   
    // 处理请求
    res.send("get /articles/:slug");
  } catch (err) {
   
    next(err);
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/68978
推荐阅读
  

闽ICP备14008679号