1. 程式人生 > 其它 >express 解析 ajax post 資料 body 為空物件

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

,即 ajax 在請求時會將使用者攜帶的引數進行 json 形式的格式化。而後端解析 body: 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 進行解析的話:會出現這種情況。
在這裡插入圖片描述