express写CRUD需求接口案例

程序员 2024-9-5 18:23:52 166 0 来自 中国
[indent][b]需求:实现对任务清单的CRUD接口服务[/b]
[/indent]
[list]
[*]查询任务列表
GET /todos
[*]根据 ID 查询单个任务
GET /todos/:id
[*]添加任务
POST /todos
[*]修改任务
PATCH /todos/:id
[*]删除任务
[/list]DELETE /todos/:id
[indent][b]目次布局及启动表示图[/b]
[/indent] 1.png [indent][b]代码视图[/b]
[/indent]
[list]
[*]app.js项目入口文件
[/list]const express = require('express')const fs = require('fs')const { getDb, saveDb } = require('./db')const app = express()const bodyParser = require('body-parser') app.use(express.json()) //设置剖析表单哀求头:application/jsonapp.use(express.urlencoded()) //设置剖析表单哀求头:application/x-www-form-urlencodedapp.use(bodyParser.urlencoded({ extended: false }))app.get('/todos', async (req, res) => {    try {        const db = await getDb()        res.status(200).json(db.todos)    } catch (err) {        res.status(500).json({            error: err.message        })    }})app.get('/todos/:id', async (req, res) => {    try {        const db = await getDb()        const todo = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))        if (!todo) {            return res.status(404).end()        }        res.status(200).json(todo)    } catch (err) {        res.status(500).json({            error: err.message        })    }})/** 2.增长接口**/app.post('/todos', async (req, res) => {    try {        const todo = req.body // 1.获取客户端哀求参数        console.log(todo.title);        if (!todo.title) { // 2.数据验证            return res.status(422).json({                error: 'The field title is required.'            })        }        // 3.数据验证通过,把数据存储到db中        const db = await getDb()        const lastTodo = db.todos[db.todos.length - 1]        //id唯一,重新写入到db文件中不覆盖,db文件是空的话,id = 1        todo.id = lastTodo ? lastTodo.id + 1 : 1,        db.todos.push(todo)        await saveDb(db) //生存文件        // 4.发送相应        res.status(201).json(todo)    } catch (err)  {        res.status(500).json({            error: err.message        })    }})/* 3.修改接口 */app.patch('/todos/:id', async (req, res) => {    try {      const todo = req.body //获取表单数据      //查找到要修改的任务项      const db = await getDb()      const result = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))      if(!result){ //修改项不存在          return res.status(404).end()      }      Object.assign(result,todo) //归并数据      await saveDb(db) //数据存储      res.status(200).json(result)    } catch (err) {        res.status(500).json({            error: err.message        })    }})/* 4.删除接口 */app.delete('/todos/:id', async (req, res) => {    try {        //查找到要修改的任务项        const todoId = Number.parseInt(req.params.id)        const db = await getDb() //获取数据库        const index = db.todos.findIndex(todo => todo.id === todoId) //根据索引举行删除        if(index === -1){ // -1代表找不到            return res.status(404).end        }        db.todos.splice(index,1) //根据索引删除一项        await saveDb(db) //数据存储        res.status(204).end() //发送状态码而且竣事相应      } catch (err) {          res.status(500).json({              error: err.message          })      }})app.listen(3000, () => {    console.log('Server is running at http://localhost:3000');})/*    没封装db.js的写法*/// app.get('/todos', (req, res) => {//     fs.readFile('./db.json', 'utf-8', (err, data) => {//         if (err) {//             res.status(500).json({//                 error: err.message//             })//         }//         const db = JSON.parse(data)//         res.status(200).json(db.todos)//     })// })
[list]
[*]db.js 是一个封装好的db模块,封装了用于读取和生存数据的方法。
[/list]/*    封装db模块*/const fs = require('fs')const { promisify } = require('util')const readFile = promisify(fs.readFile) //提供promise支持的异步读文件使用const writeFile = promisify(fs.writeFile)const path = require('path')const dbPath = path.join(__dirname,'./db.json') //动态拼接路径 exports.getDb = async () => {    const data = await readFile(dbPath, 'utf-8')    return JSON.parse(data) //读取json文件并转换}exports.saveDb = async db => {    const data = JSON.stringify(db, null, '  ') //后2个参数让写入内容的时间是换行对其    await writeFile(dbPath, data)}
[list]
[*]db.json 模拟充当数据库存储
[/list]{  "todos": [    {      "id": 1,      "title": "看电视"    },    {      "id": 2,      "title": "用饭"    },    {      "id": 3,      "title": "敲代码"    },    {      "title": "看电视",      "id": 4    }  ],  "users": []}[indent][b]Postman工具测试查验接口[/b]
[/indent][list=1]
[*]查询任务列表


[*]根据ID查询单个任务

3.png
[*]添加任务项


我们再来看看db.json有没有多出了id为5的任务项。


[*]根据ID修改查询到的单个任务


db.json有没有修改乐成?


[*]根据ID删除查询到的单个任务

8.png
db.json检察另有没有id为4的任务项。


[/list][indent][b]express.json()和express.urlencoded()的区别[/b]
[/indent] 10.png 以POSTMAN工具为例子
11.png
[list]
[*][b]总结:[/b]express.urlencoded()以键值对的情势填写哀求,express.json()以json格式填写哀求.
[/list]
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-1-29 07:41, Processed in 0.210914 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表