Node.js发送DELETE请求后JSON文件内对象未删除问题求助
DELETE请求删除JSON文件指定对象功能修复方案
核心错误说明
Array.splice()方法的第一个参数需要是待删除元素的数组索引,你当前传入的是查询到的Acar对象本身,无法定位到正确的删除位置,所以删除逻辑不生效。- 操作顺序错误:你先把未修改的
cars数组写入了JSON文件,之后才执行splice删除操作,写入到文件的永远是没有删除数据的原始数组。 - 状态码使用不规范:HTTP 204状态码定义为无响应内容,返回该状态码时携带的JSON响应体会被大部分客户端忽略,不符合HTTP规范。
- 缺省错误捕获:没有判断文件写入失败的异常场景,出现IO错误时接口会无响应。
修复后的完整代码
const express = require('express'); const fs = require('fs'); const app = express(); app.use(express.json()); // 首次启动前需确保Data目录存在,否则会抛出读写错误 const cars = JSON.parse(fs.readFileSync(`${__dirname}/Data/cars.json`)) const deleteCar = (req, res)=>{ const id = req.params.id * 1 // 改用findIndex直接获取目标元素的数组索引 const carIndex = cars.findIndex(el => el.id === id); if(carIndex === -1){ return res.status(404).json({ status : "failed", message : "请求的资源不存在" }) } // 先执行删除操作修改cars数组 const deletedCar = cars.splice(carIndex, 1) // 再把修改后的数组写入文件,JSON.stringify加格式化参数方便后续查看 fs.writeFile(`${__dirname}/Data/cars.json`, JSON.stringify(cars, null, 2), err=>{ if(err) { return res.status(500).json({ status: "failed", message: "数据保存失败" }) } // 改用200状态码返回响应内容 res.status(200).json({ status : "success", data : { car : deletedCar } }) }) }; app.delete('/api/v1/cars/:id', deleteCar) const port = 2000 app.listen(port, ()=>{ console.log(`服务已启动,监听端口${port}`); })
内容的提问来源于stack exchange,提问作者Adil Nehal
相关产品推荐
相关产品推荐

