01.app.js

    1. const express = require('express')
    2. const fs = require('fs')
    3. const app = express()
    4. const {getDb,saveDb} = require('./module/db.js')
    5. // 配置解析表单请求体:applicatin/json
    6. app.use(express.json())
    7. // 配置解析表单请求体:applicatin/urlencoded
    8. app.use(express.urlencoded())
    9. app.get('/todos',async (req,res) => {
    10. try{
    11. const db = await getDb()
    12. res.status(200).json(db.todos)
    13. }catch(err){
    14. res.status(500).json({
    15. error:err.message
    16. })
    17. }
    18. // fs.readFile('./file/db.json','utf-8',(error,data) => {
    19. // if(error){
    20. // console.log('没找到资源');
    21. // return res.status(500).json({
    22. // error: error.message
    23. // })
    24. // }
    25. // const db = JSON.parse(data)
    26. // // http中一起请求只能对应一个响应
    27. // res.status(200).json(db.todos)
    28. // })
    29. })
    30. // :id类似正则匹配
    31. app.get('/todos/:id', async (req,res) => {
    32. // 下面获取id参数的方法值得注意
    33. // res.send(`get/todos/${req.params.id}`)
    34. // fs.readFile('./file/db.json','utf-8',(error,data) => {
    35. // if(error){
    36. // return res.status(500).json({
    37. // error:error.message
    38. // })
    39. // }
    40. // const db = JSON.parse(data)
    41. // const todo = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
    42. // if(!todo){
    43. // return res.status(404).end()
    44. // }
    45. // res.status(200).json(todo)
    46. // })
    47. try{
    48. const db =await getDb()
    49. const todo = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
    50. if(!todo){
    51. return res.status(404).end()
    52. }
    53. res.status(200).json(todo)
    54. }catch(err){
    55. res.status(404).json({
    56. error:err.message
    57. })
    58. }
    59. })
    60. app.post('/todos', async (req,res) => {
    61. try{
    62. // 获取客户端请求体参数
    63. const todo = req.body
    64. // 数据验证
    65. if (!todo.title) {
    66. return res.status(422).json({
    67. error:'The field title is required'
    68. })
    69. }
    70. // 数据验证通过把数据存储到db中
    71. const db = await getDb()
    72. const lastTodo = db.todos[db.todos.length-1]
    73. todo.id = lastTodo ? lastTodo.id+1 : 1
    74. db.todos.push(todo)
    75. await saveDb(db)
    76. // 发送响应
    77. res.status(200).json(todo)
    78. }catch(err){
    79. res.status(500).json({
    80. error:err.message
    81. })
    82. }
    83. res.send('post/todos')
    84. })
    85. app.patch('/todos/:id', async (req,res) => {
    86. try{
    87. // 获取表单数据
    88. const todo = req.body
    89. // 查找到要修改的任务项
    90. const db = await getDb()
    91. const ret = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
    92. if(!ret){
    93. return res.status(404).end()
    94. }
    95. Object.assign(ret,todo)
    96. await saveDb(db)
    97. res.send('修改数据成功')
    98. }catch(err){
    99. res.status(500).json({
    100. error:err.message
    101. })
    102. }
    103. })
    104. app.delete('/todos/:id', async (req,res) => {
    105. try{
    106. const todoId = Number.parseInt(req.params.id)
    107. const db = await getDb()
    108. const index = db.todos.findIndex(todo => todo.id === todoId)
    109. if(index === -1){
    110. return res.status(404).end()
    111. }
    112. db.todos.splice(index,1)
    113. await saveDb(db)
    114. res.status(204).end()
    115. }catch(err){
    116. res.status(500).json({
    117. error:err.message
    118. })
    119. }
    120. })
    121. app.listen(3000,() => {
    122. console.log(`服务已经启动,http://localhost:3000`);
    123. })

    db.js

    1. const fs = require('fs')
    2. const { promisify } = require('util')
    3. const path = require('path')
    4. const readFile = promisify(fs.readFile)
    5. const writeFile = promisify(fs.writeFile)
    6. // 获取dbPath的绝对路径
    7. const dbPath = path.join(__dirname,'../file/db.json')
    8. exports.getDb = async () => {
    9. const data = await readFile(dbPath,'utf8')
    10. return JSON.parse(data)
    11. }
    12. -
    13. exports.saveDb = async db => {
    14. const data = JSON.stringify(db,null,' ')
    15. await writeFile(dbPath,data)
    16. }