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

Node.js Express中POST任务到JSON列报错Cannot GET /api/tasks求助

问题分析与解决方案

直接导致"Cannot GET /api/tasks"的原因

你注册的是POST请求接口/api/tasks,但实际发起的是GET请求访问该路径,服务器找不到对应的路由处理逻辑,因此返回404错误。

解决方法:

  • 确保发起的是POST请求(比如用Postman、curl测试时指定请求方法为POST,前端用fetch/axios时明确method: 'POST')。

代码中的其他潜在问题(不修复会导致接口功能异常)

  1. 请求体解析方式错误
    你的请求体是JSON格式,但用了qs.parse(body)解析(qs用于解析URL编码格式的参数,如title=xxx&text=yyy),会导致解析失败。应替换为JSON.parse(body),同时要处理解析失败的情况:

    try {
      let newData = JSON.parse(body);
      // 后续业务逻辑
    } catch (err) {
      res.writeHead(400);
      res.end('无效的JSON格式');
      return;
    }
    
  2. 未声明的全局变量body
    代码中body = ''没有用let/const声明,会成为全局变量存在风险,修改为:

    let body = '';
    
  3. 内存数据未持久化到文件
    你仅修改了内存中的jsonData对象,但未将修改内容写回columns.json文件,重启服务后新增任务会丢失。需添加文件写入逻辑:

    const fs = require('fs');
    const path = require('path');
    
    // 在target.tasks.push(newTask)之后添加:
    fs.writeFile(
      path.join(__dirname, './data/columns.json'),
      JSON.stringify(jsonData, null, 2),
      (err) => {
        if (err) {
          console.error('写入文件失败:', err);
          res.writeHead(500);
          res.end('服务器内部错误');
          return;
        }
        res.writeHead(201, {'Content-Type': 'application/json'});
        res.end(JSON.stringify({id: newId}));
      }
    );
    

    注意要把原本的响应逻辑移到文件写入的回调中,避免在文件写入完成前就返回响应。

  4. 请求体格式示例有语法错误
    你给出的请求体示例中,"taskTags: Array[String]"缺少闭合引号,正确格式应为"taskTags": Array[String]。

  5. 可能未导入qs模块
    如果代码中没有const qs = require('querystring')或const qs = require('qs'),会导致qs.parse报错。但因为你用的是JSON请求体,直接换成JSON.parse即可,无需依赖qs。

修正后的完整代码示例

const fs = require('fs');
const path = require('path');
const jsonData = require('./data/columns.json');

app.post('/api/tasks', (req, res) => {
  let body = '';
  
  req.on('data', chunk => {
    body += chunk.toString();
  });
  
  req.on('end', () => {
    if (body.length === 0) {
      res.writeHead(400);
      res.end('请求体不能为空');
      return;
    }

    let newData;
    try {
      newData = JSON.parse(body);
    } catch (err) {
      res.writeHead(400);
      res.end('无效的JSON格式');
      return;
    }

    if (!newData.title || !newData.text || isNaN(newData.column)) {
      res.writeHead(400);
      res.end('缺少必填字段或列ID无效');
      return;
    }

    const newId = calculateInitialTaskIdCounter();
    const newTask = {
      id: newId,
      column: newData.column,
      title: newData.title,
      text: newData.text,
      taskTags: newData.taskTags || []
    };

    const target = jsonData.find(column => column.id == newData.column);
    if (!target) {
      res.writeHead(400);
      res.end('目标列不存在');
      return;
    }

    target.tasks.push(newTask);

    fs.writeFile(
      path.join(__dirname, './data/columns.json'),
      JSON.stringify(jsonData, null, 2),
      (err) => {
        if (err) {
          console.error('文件写入错误:', err);
          res.writeHead(500);
          res.end('保存任务失败');
          return;
        }
        res.writeHead(201, {'Content-Type': 'application/json'});
        res.end(JSON.stringify({id: newId}));
      }
    );
  });
});

内容的提问来源于stack exchange,提问作者Avissa Taghizadeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:21