express写CRUD需求接口案例

程序员 2024-9-5 18:23:52 1515 0
需求:实现对任务清单的CRUD接口服务


  • 查询任务列表
    GET /todos
  • 根据 ID 查询单个任务
    GET /todos/:id
  • 添加任务
    POST /todos
  • 修改任务
    PATCH /todos/:id
  • 删除任务
DELETE /todos/:id
目次布局及启动表示图
1.png
代码视图


  • app.js项目入口文件
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)//     })// })

  • db.js 是一个封装好的db模块,封装了用于读取和生存数据的方法。
/*    封装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)}

  • db.json 模拟充当数据库存储
{  "todos": [    {      "id": 1,      "title": "看电视"    },    {      "id": 2,      "title": "用饭"    },    {      "id": 3,      "title": "敲代码"    },    {      "title": "看电视",      "id": 4    }  ],  "users": []}
Postman工具测试查验接口

  • 查询任务列表


  • 根据ID查询单个任务

    3.png
  • 添加任务项


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


  • 根据ID修改查询到的单个任务


    db.json有没有修改乐成?


  • 根据ID删除查询到的单个任务

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


express.json()和express.urlencoded()的区别
10.png 以POSTMAN工具为例子
11.png

  • 总结:express.urlencoded()以键值对的情势填写哀求,express.json()以json格式填写哀求.
评论
登录 后才能评论

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

GMT+8, 2026-4-28 21:35, Processed in 0.354959 second(s), 35 queries.© 2003-2025 cbk Team.

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