[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]
[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查询单个任务
[*]添加任务项
我们再来看看db.json有没有多出了id为5的任务项。
[*]根据ID修改查询到的单个任务
db.json有没有修改乐成?
[*]根据ID删除查询到的单个任务
db.json检察另有没有id为4的任务项。
[/list][indent][b]express.json()和express.urlencoded()的区别[/b]
[/indent]
以POSTMAN工具为例子
[list]
[*][b]总结:[/b]express.urlencoded()以键值对的情势填写哀求,express.json()以json格式填写哀求.
[/list] |