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')。
代码中的其他潜在问题(不修复会导致接口功能异常)
请求体解析方式错误
你的请求体是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; }未声明的全局变量
body
代码中body = ''没有用let/const声明,会成为全局变量存在风险,修改为:let body = '';内存数据未持久化到文件
你仅修改了内存中的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})); } );注意要把原本的响应逻辑移到文件写入的回调中,避免在文件写入完成前就返回响应。
请求体格式示例有语法错误
你给出的请求体示例中,"taskTags: Array[String]"缺少闭合引号,正确格式应为"taskTags": Array[String]。可能未导入
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
相关产品推荐
相关产品推荐

