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

POST请求返回404错误,GET请求可正常获取数据的问题排查

为什么我的Express POST请求返回404错误?

兄弟,问题根源特别明确——你在Express服务器里只写了处理GET /api/tasks的路由,完全没定义POST请求的对应路由!

当你用GET请求访问时,Express能匹配到app.get('/api/tasks')的处理逻辑,所以正常返回数据;但发送POST请求到同一个路径时,服务器找不到对应的处理函数,就直接返回404 Not Found了。

解决步骤:


1. 添加POST路由处理逻辑

在你的Express代码里,和GET路由同级的位置,新增一个POST路由:

// 假设你已经有了处理插入的db方法,比如InsertTask
app.post('/api/tasks', async (req, res) => {
  try {
    // 从请求体中获取task_title
    const { task_title } = req.body;
    // 调用db层的插入函数
    const createdTask = await db.InsertTask(task_title);
    // 返回201状态码(表示资源创建成功)和新创建的任务数据
    res.status(201).json(createdTask);
  } catch (error) {
    console.error('创建任务失败:', error);
    res.status(500).json({ message: '服务器内部错误,无法创建任务' });
  }
});

2. 必须配置JSON解析中间件

别忘了,Express默认不会自动解析JSON格式的请求体!如果还没加,一定要在所有路由定义之前添加这个中间件:

const express = require('express');
const app = express();

// 关键:解析JSON请求体
app.use(express.json());

// 然后再定义你的GET和POST路由
app.get('/api/tasks', (req, res)=>{
  db.SelectAll().then(data => {res.json(data)});
});

app.post('/api/tasks', ...); // 刚才写的POST路由

3. 补充DB层的插入函数

你的db.js里需要新增一个插入任务的异步函数,比如:

async function InsertTask(taskTitle) {
  try {
    // 使用参数化查询防止SQL注入,同时返回插入的记录
    const result = await client.query(
      "INSERT INTO tasks (task_title) VALUES ($1) RETURNING *",
      [taskTitle]
    );
    return result.rows[0]; // 返回刚插入的任务数据
  } catch(err) {
    console.error('数据库插入错误:', err);
    throw err; // 把错误抛给上层路由处理
  }
}

// 别忘了导出这个函数
module.exports = { SelectAll, InsertTask };

额外提醒:


  • 你的SelectAll函数有个小问题:client.end()放在了try/catch块外面,不管查询成功还是失败都会关闭数据库连接,后续请求会因为连接关闭而报错。建议去掉client.end(),改用数据库连接池来管理连接,或者在合适的时机统一关闭连接。
  • 确保你的数据库表tasks确实存在task_title字段,并且没有设置不合理的约束(比如非空但你没传值)。

内容的提问来源于stack exchange,提问作者Personal Professores de Inglês

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:17:47