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

ExpressJS POST路由报404错误,如何定义路由接收参数?

解决Express POST接口接收JSON参数并写入文件的404问题

首先得明确你遇到的核心问题:你把JSON字符串直接拼在了URL路径末尾,导致请求的URL变成了/filewrite/[JSON内容],但你定义的路由只匹配/filewrite/,Express找不到对应的处理函数,自然返回404。除此之外,就算路由匹配了,你当前的代码也拿不到正确的请求数据——因为Express默认不会自动解析JSON格式的请求体。

下面一步步给你解决:

1. 先把请求发送方式改对

发起POST请求时,千万别把JSON塞URL里,正确的做法是:

  • 给请求加Content-Type: application/json的请求头
  • 把JSON数据放在请求的Body体里(不是URL路径)

举个curl的例子,这样发请求才对:

curl -X POST http://localhost:5000/filewrite \
  -H "Content-Type: application/json" \
  -d '{"db":[{"ID":"11111111","job":"22222222"}]}'

如果用Postman之类的工具,就选POST方法,URL填http://localhost:5000/filewrite,然后在Body里选raw、格式选JSON,把你的JSON数据填进去就行。

2. 给Express加JSON解析中间件

Express默认不会帮你解析JSON请求体,所以必须在路由定义前加上express.json()中间件,这样req.body才能拿到请求里的JSON数据:

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

// 这行是关键!一定要加在路由前面
app.use(express.json());

// 接下来再定义你的路由

3. 修正路由和文件写入逻辑

你的路由末尾的/可以去掉(当然保留也没问题,但请求时别在URL后面加额外内容),另外注意:req.body是JavaScript对象,直接写入文件会变成[object Object],必须转成JSON字符串才行。完整的路由代码如下:

const fs = require('fs');
const path = require('path'); // 用path模块处理路径更靠谱,避免相对路径坑

app.post('/filewrite', (req, res) => {
  // 先校验请求体是否存在
  if (!req.body) {
    return res.status(400).send('请求体不能为空');
  }

  // 把对象转成格式化的JSON字符串,缩进2空格方便阅读
  const jsonStr = JSON.stringify(req.body, null, 2);
  // 用path.resolve生成绝对路径,避免不同运行目录下路径出错
  const targetPath = path.resolve(__dirname, './db/test.json');

  // 可选:自动创建db目录(如果不存在的话)
  fs.mkdirSync(path.dirname(targetPath), { recursive: true });

  fs.writeFile(targetPath, jsonStr, (err) => {
    if (err) {
      console.error('写入文件失败:', err);
      return res.status(500).send('文件写入失败');
    }
    console.log('文件保存成功!');
    res.status(200).send('文件保存成功');
  });
});

额外小建议

如果觉得回调写法麻烦,可以用fs.promises.writeFile配合async/await,代码会更清爽:

app.post('/filewrite', async (req, res) => {
  if (!req.body) {
    return res.status(400).send('请求体不能为空');
  }

  try {
    const jsonStr = JSON.stringify(req.body, null, 2);
    const targetPath = path.resolve(__dirname, './db/test.json');
    fs.mkdirSync(path.dirname(targetPath), { recursive: true });
    await fs.promises.writeFile(targetPath, jsonStr);
    console.log('文件保存成功!');
    res.status(200).send('文件保存成功');
  } catch (err) {
    console.error('写入文件失败:', err);
    res.status(500).send('文件写入失败');
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:11:55