簡體   English   中英

無法在 express js 節點中獲取請求負載

[英]Cant get request payload in express js node

這是我的 Node Express 代碼,

(function () {
    'use strict';
    var fs = require('fs');
    var cors = require('cors');
    var bodyParser = require('body-parser');
    var express = require('express'),
        app = express(),
        port = 8112;


    app.use(cors());
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    app.listen(port);


    app.route('/abc')
        .post(abc);


    function abc(req,res){
        console.dir(req.body);
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        res.sendStatus(200);
    }

})();

但我得到了請求正文

{}

但是在 Chrome 的網絡選項卡中,我可以看到請求負載。 請注意 OPTIONS 在此 POST 調用之前被觸發。

請求頭

POST /abcHTTP/1.1 主機:本地主機:8112 連接:
keep-alive Content-Length: 11 Pragma: no-cache Cache-Control: no-cache
來源: http://localhost:4200用戶代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/66.0.3359.181 Safari/537.36
x-api-key:CExkxDlFC35ckfCGX6m61x76GxIYH2h2Iv8bX874
內容類型:文本/純文本;字符集=UTF-8
Accept: / Referer: http://localhost:4200/dashboard Accept-Encoding: gzip, deflate, br
接受語言:en-US,en;q=0.9

請求有效載荷

{"dd":"dd"}

您需要發送: Content-Type: application/json才能使bodyParser.json()工作,沒有它,您的 JSON 負載將不會被解析,這就是您得到的原因: {}

文檔

bodyParser 對象公開各種工廠以創建中間件。 當 Content-Type 請求標頭與 type 選項匹配時,所有中間件都將使用解析的正文填充 req.body 屬性,如果沒有要解析的正文,則為空對象 ({}),或者 Content-Type 不匹配,或者發生錯誤。

使用.fetch示例:

fetch('http://localhost:4200/dashboard', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({dd: 'dd'})
});

您的內容類型標題是文本/純文本。 請嘗試更換

app.use(bodyParser.json());

app.use(bodyParser.text());

嗨@Pradhaban Nandhakumar,我認為您必須將數據作為行數據傳遞。 試試下面的代碼片段。

您應該始終傳遞原始數據。

app.post('/users', (req, res) => { res.send(req.body); });

您發布的是純文本字符串而不是 JSON。 考慮向我們展示您如何發布數據(jQuery、Fetch API 等)。

只需要指定

headers: {
  'Accept': 'application/json',
  'Content-Type': 'application/json'
}

在您的請求標頭(前端)中。 然后 Express 正文解析器應該能夠檢測到有效的 JSON 並打印結果。 請注意, Accept不是必需的,但它會指示服務器客戶端理解並接受 JSON 響應。

或者,在前端使用簡單的庫(如Easy Fetch)來管理服務器端調用,而無需處理響應解析或標頭設置。

這通常是由於您的 http 請求中的“Content-type”標頭造成的。

JSON 正文
bodyParser.json() 只接受“application/json”類型,拒絕其他不匹配的內容類型。

解決方案 1:接受除application/json額外內容類型

檢查您的請求標頭“Content-type”並將其添加到服務器中 bodyParser.json([options]) 的 options 參數中。

例如,如果你有這個:
“內容類型:應用程序/csp-report”

app.use(bodyParser.json({ type: ["application/json", "application/csp-report"] }));

您還可以使用 exprs v4.16.0 以后的內置中間件:

app.use(express.json({ type: ['application/json', 'application/csp-report'] }));

有關更多信息,請參閱此文檔

注意:僅在不能將Content-type更改為application/json使用此方法。

解決方案2(推薦):在Http請求application/json Header content-type application/json

urlencoded body 怎么樣?
這類似於 json 主體,但有兩個不同之處:

  1. 請求中接受的“內容類型”標頭是“application/x-www-form-urlencoded”

  2. 正文有效負載是 url 編碼格式(不是 json 對象):
    格式: param_1=value_1&param_2=value_2&...

app.use(express.urlencoded({ extended: false }));

請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM