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__
相关产品推荐
相关产品推荐

