Express中req.body无法获取AJAX POST数据问题求助
问题排查与解决:Express无法获取AJAX POST请求的req.body数据
核心问题原因
你在前端AJAX请求中错误搭配了参数:设置了processData: false和contentType: false(这两个参数仅用于发送FormData格式数据),但实际发送的是普通JSON对象,导致请求的Content-Type不符合服务器解析要求,最终req.body为空。
解决方案
根据你需要的请求数据格式,二选一修改前端代码:
方案1:发送JSON格式数据(推荐)
修改login.js中的AJAX配置,移除不必要的processData和contentType参数,让jQuery自动设置正确的请求头:
$(document).ready(function(){ $("#continuarBoton").on("click", function(){ $.ajax({ url: '/login', method: 'POST', dataType: 'json', data: { correo: "test1", contrasena: "test2" }, success: function(data) { console.log(data); if(data.Exito){ console.log("Solicitud POST exitosa"); }else{ console.error("Solicitud POST DENEGADA"); } }, error: function(error) { console.error(error); } }); }); });
服务器端你已经添加了app.use(express.json());,可以正常解析JSON格式的请求体,无需额外修改。
方案2:发送FormData格式数据
如果确实需要用FormData(比如上传文件),则要将data设置为实际的FormData对象,保留processData和contentType参数:
$(document).ready(function(){ $("#continuarBoton").on("click", function(){ var formData = new FormData(); formData.append("correo", $("#correo").val()); formData.append("contrasena", $("#contrasena").val()); $.ajax({ url: '/login', method: 'POST', dataType: 'json', data: formData, // 传入FormData对象 processData: false, contentType: false, success: function(data) { console.log(data); if(data.Exito){ console.log("Solicitud POST exitosa"); }else{ console.error("Solicitud POST DENEGADA"); } }, error: function(error) { console.error(error); } }); }); });
这种情况下,服务器端需要安装并配置multer中间件来解析multipart/form-data格式:
- 安装依赖:
npm install multer
- 修改
usuarios.js路由配置:
const express = require('express'); const router = express.Router(); const multer = require('multer'); const upload = multer(); // 仅解析FormData,不存储文件 const usuariosController = require('../controllers/usuariosController'); router.use(upload.none()); // 解析不带文件的FormData router.get('/', usuariosController.view); router.post('/', usuariosController.post); module.exports = router;
额外优化建议
- Express 4.16及以上版本已内置body-parser功能,直接使用
app.use(express.json())和app.use(express.urlencoded({extended: false}))即可,无需单独安装body-parser包。 - 确保中间件配置放在路由之前,保证所有路由都能使用解析中间件(你当前的
express.json()位置正确)。
内容的提问来源于stack exchange,提问作者Flacuchentxox
相关产品推荐
相关产品推荐

