01.app.js
const express = require('express')const fs = require('fs')const app = express()const {getDb,saveDb} = require('./module/db.js')// 配置解析表单请求体:applicatin/jsonapp.use(express.json())// 配置解析表单请求体:applicatin/urlencodedapp.use(express.urlencoded())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})}// fs.readFile('./file/db.json','utf-8',(error,data) => {// if(error){// console.log('没找到资源');// return res.status(500).json({// error: error.message// })// }// const db = JSON.parse(data)// // http中一起请求只能对应一个响应// res.status(200).json(db.todos)// })})// :id类似正则匹配app.get('/todos/:id', async (req,res) => {// 下面获取id参数的方法值得注意// res.send(`get/todos/${req.params.id}`)// fs.readFile('./file/db.json','utf-8',(error,data) => {// if(error){// return res.status(500).json({// error:error.message// })// }// const db = JSON.parse(data)// 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)// })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(404).json({error:err.message})}})app.post('/todos', async (req,res) => {try{// 获取客户端请求体参数const todo = req.body// 数据验证if (!todo.title) {return res.status(422).json({error:'The field title is required'})}// 数据验证通过把数据存储到db中const db = await getDb()const lastTodo = db.todos[db.todos.length-1]todo.id = lastTodo ? lastTodo.id+1 : 1db.todos.push(todo)await saveDb(db)// 发送响应res.status(200).json(todo)}catch(err){res.status(500).json({error:err.message})}res.send('post/todos')})app.patch('/todos/:id', async (req,res) => {try{// 获取表单数据const todo = req.body// 查找到要修改的任务项const db = await getDb()const ret = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))if(!ret){return res.status(404).end()}Object.assign(ret,todo)await saveDb(db)res.send('修改数据成功')}catch(err){res.status(500).json({error:err.message})}})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){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(`服务已经启动,http://localhost:3000`);})
db.js
const fs = require('fs')const { promisify } = require('util')const path = require('path')const readFile = promisify(fs.readFile)const writeFile = promisify(fs.writeFile)// 获取dbPath的绝对路径const dbPath = path.join(__dirname,'../file/db.json')exports.getDb = async () => {const data = await readFile(dbPath,'utf8')return JSON.parse(data)}-exports.saveDb = async db => {const data = JSON.stringify(db,null,' ')await writeFile(dbPath,data)}
