Node/Express REST API删除JSON数组指定ID项filter失效问题
问题根因
删除功能不生效的核心错误是对Array.filter()方法的用法理解有误:
filter()不会修改调用它的原数组,执行后会返回一个符合过滤规则的全新数组- 你当前的代码只是调用了
obj.projects.filter(),但没有接收这个返回的新数组,obj.projects始终保持读取到的原始值,写回JSON文件的自然还是未删除的旧数据。
另外代码里还有三个容易出问题的写法:
- 在filter循环内部重复读取
req.query.identify,属于无意义的性能损耗 - 文件读写出错时直接
throw err会直接导致Node进程崩溃,不会走你写的全局错误处理中间件 - 全局声明的
var obj = { projects: []}会被所有请求共享,并发请求场景下会出现数据互相覆盖的问题
修复后的完整代码
核心修正DELETE接口的filter赋值逻辑,其他接口同步优化错误处理、移除全局变量避免污染:
const express = require('express'); const fs = require('fs'); const app = express(); app.post('/', (req, res, next)=>{ const identifier = req.query.identify; // 新增项目的id fs.readFile('webProjects.json', (err, data)=>{ if(err) return next(err); const obj = JSON.parse(data); obj.projects.push({id:identifier, game: req.query.project}); const json = JSON.stringify(obj); fs.writeFile('webProjects.json', json, (err)=>{ if(err) return next(err); res.send({code:200, message:"项目添加成功", data: obj.projects}) }) }) }) // DELETE接口删除指定id条目 app.delete("/", (req, res, next)=>{ // 提前提取要删除的目标id,不要放在循环内重复取值 const targetId = req.query.identify; fs.readFile('webProjects.json', (err, data)=>{ if(err) return next(err); const obj = JSON.parse(data); // 关键修复:接收filter返回的新数组,重新赋值给projects属性 obj.projects = obj.projects.filter((item)=> item.id !== targetId); const json = JSON.stringify(obj); fs.writeFile('webProjects.json', json, (err)=>{ if(err) return next(err); res.send({code:200, message:"项目删除成功", data: obj.projects}) }) }) }) // 查询接口 app.get('/:id', (req, res, next)=>{ fs.readFile('webProjects.json', (err, data)=>{ if (err) return next(err); const obj = JSON.parse(data); // 可自行补充id匹配逻辑,当前逻辑返回全量存储数据 res.send(obj); }) }) // 404路由 app.get('*', (req, res, next)=>{ const err = new Error('There was an error in accessing the page you wanted'); err.statusCode = 404; next(err); }) // 全局错误处理中间件 app.use((err, req, res, next)=>{ console.log(err.message) if(!err.statusCode) err.statusCode = 500; res.status(err.statusCode).send(err.message); }) app.listen(8080, ()=>{ console.log("server has listened") })
验证方式
启动服务后发送DELETE请求,比如携带查询参数identify=1,操作完成后读取JSON文件,就会发现id为1的条目已经被移除,示例文件修改后内容为:
{"projects":[{"id":"2","game":"min"}]}
内容的提问来源于stack exchange,提问作者George Marwanqana
相关产品推荐
相关产品推荐

