You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:51:58