express 解析 ajax post 資料 body 為空物件
問題描述:
前端使用 jquery 的 ajax 向後端傳送 post 資料並攜帶引數,但是 express 解析的 body 為空物件。
程式碼:
使用 express 框架解析前端 post 的資料時
var express = require("express");
var bodyParser = require("body-parser");
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.post("/userName" , (req, res) => {
console.log(req.body);
res.send("接受到了資料");
});
前端使用 jquery 的 ajax 進行傳輸資料
loginButton.addEventListener("click", (e) => {
console.log("這裡傳送請求");
$.ajax({
type: "post",
url: "/userName",
contentType: "application/json" ,
data: JSON.stringify({ userName: "xiaoming" }),
}).done((msg) => {
console.log("這裡是返回內容", msg);
});
});
但是 express 解析到的前端 request 中的 body 為空物件。
原因是:
前端使用 jquery 的 ajax 進行 post 請求時,預設的 contentType 為:application/x-www-form-urlencoded
但是我在前端設定成了 application/json
bodyParser.urlencoded({ extended: false })
是解析 application/x-www-form-urlencoded
形式的引數的,因此後端解析出來的 body 為空物件。
解決方法:
方法一:
express 使用 app.use(bodyParser.json());
替代 app.use(bodyParser.urlencoded({ extended: false }));
來解析 body
方法二:
前端設定contentType: application/x-www-form-urlencoded
並且刪除data中的 JSON.stringify ,後端不改動還是 app.use(bodyParser.urlencoded({ extended: false }));
即可解析出 body。
contentType 中常見的選項有: application/x-www-form-urlencoded 、 application/json、text/xml 、 multipart/form-data 這些選項用於表明傳送資料流的型別,後端根據型別進行對應的資料解析。
application/json 資料格式可以支援複雜情況,比如傳輸資料中物件中包含陣列。
而如果用 appliacation/x-www-form-urlencoded 進行解析的話:會出現這種情況。