ฉันจะใช้ข้อมูล JSON POST ในแอปพลิเคชัน Express ได้อย่างไร


307

ฉันกำลังส่งสตริง JSON ต่อไปนี้ไปยังเซิร์ฟเวอร์ของฉัน

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

บนเซิร์ฟเวอร์ฉันมีสิ่งนี้

app.post('/', function(request, response) {

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

เมื่อฉันส่งสตริงมันแสดงให้เห็นว่าฉันได้รับการตอบกลับ 200 ครั้ง แต่วิธีการอีกสองวิธีนั้นไม่เคยทำงาน ทำไมถึงเป็นอย่างนั้น?

คำตอบ:


479

ฉันคิดว่าคุณกำลังพูดถึงการใช้responseวัตถุกับสิ่งrequestนั้น

responseวัตถุสำหรับการส่งการตอบสนอง HTTP requestกลับไปที่ลูกค้าเรียกร้องในขณะที่คุณกำลังต้องการที่จะเข้าถึงร่างกายของ ดูคำตอบที่ให้คำแนะนำนี้

หากคุณกำลังใช้ JSON ที่ถูกต้องและกำลังโพสต์ด้วยContent-Type: application/jsonคุณสามารถใช้bodyParserมิดเดิลแวร์เพื่อวิเคราะห์เนื้อความคำขอและวางผลลัพธ์ในrequest.bodyเส้นทางของคุณ

var express = require('express')
  , app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

ทดสอบตามบรรทัดของ:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

อัปเดตสำหรับ Express 4+

ตัวแยกวิเคราะห์เนื้อหาถูกแยกออกเป็นแพ็คเกจ npm ของตัวเองหลังจาก v4 ต้องติดตั้งแยกต่างหาก npm install body-parser

var express = require('express')
  , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

อัปเดตสำหรับ Express 4.16+

เริ่มจากรีลีส 4.16.0 express.json()มิดเดิลแวร์ใหม่จะพร้อมใช้งาน

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

21
request.body.MyKey
Pero P.

5
เนื่องจากการต่อข้อมูลจะเกิดtoString()ขึ้นบนวัตถุ ลองดูที่โหนดเอกสารเพื่อconsole.logตรวจสอบวัตถุและส่งคืนการแทนสตริง
Pero P.

13
console.log('request =' + JSON.stringify(request.body))
Pero P.

3
ปัจจุบันconsole.log()จะทำให้วัตถุเป็นวัตถุโดยอัตโนมัติ (ผ่านutil.inspect()) ดังนั้นสิ่งนี้จะทำงานได้:console.log("with request", request.body);
Tommy Stanton

4
คำตอบนี้ล้าสมัย แต่คำตอบจาก @chrisarton เป็นรุ่นล่าสุดแล้ว
Emil Ingerslev

209

สำหรับ Express v4 +

ติดตั้ง body-parser จาก npm

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})

23
ทำไมพวกเขาถึงนำสิ่งที่ทุกคนใช้ไปเรื่อย ๆ
light24bulbs

11
@ light24bulbs ดังนั้น (Express) จะดูผอมกว่าและมีความหมายสำหรับผู้ที่ไม่ได้ใช้ / ต้องการมัน
andyengle

6
@andyengle นั่นทำให้รู้สึก แต่ฉันคิดว่าแทบทุกคนใช้การแยกวิเคราะห์คำขอ นั่นดูเหมือนจะเป็นคุณสมบัติหลักสำหรับฉัน
light24bulbs

23
เนื่องจากอินเทอร์เฟซฟังก์ชันมิดเดิลแวร์เป็นมาตรฐานที่ใช้โดยไลบรารีจำนวนมากจึงอนุญาตให้แอปที่ไม่ใช้ Express เพื่อใช้ฟังก์ชันมิดเดิลแวร์เหล่านี้
Anm

3
การนำออกจากด่วนไม่อนุญาตให้แอปพลิเคชันที่ไม่ใช้คำขอใช้ พวกเขาสามารถแยกมันออกเป็นส่วน ๆ และรวมไว้ในค่าเริ่มต้นได้
JJ

18

บางครั้งคุณไม่จำเป็นต้องมีห้องสมุดบุคคลที่สามในการวิเคราะห์ JSON จากข้อความ บางครั้งสิ่งที่คุณต้องการคือคำสั่ง JS ต่อไปนี้ลองใช้ก่อน:

        const res_data = JSON.parse(body);

3
คำถามเดิมเกี่ยวกับการแยกวิเคราะห์ JSON จากข้อความ POST ในกรอบงานด่วน หากไม่มีมิดเดิลแวร์ BodyParser ข้อมูล JSON จะไม่มีอยู่ในคุณสมบัติเนื้อหาของวัตถุคำขอ
ThisClark

1
ฉันพบว่ามีประโยชน์นี้เมื่อวิเคราะห์คำตอบของเซิร์ฟเวอร์ ขอบคุณ!
Hasan Alsawadi

1
ขอบคุณ Hasan ฉันขอขอบคุณความคิดเห็นของคุณ มันช่วยฉันได้เมื่อฉันกำลังมองหาทางออกและเจอโพสต์นี้ ไม่แน่ใจว่ามันใช้งานได้ในทุกกรณี แต่มันใช้งานได้ในบางกรณีและเป็นทางออกที่ดีกว่าการใช้ห้องสมุดของบุคคลที่สาม
xims

1
คำตอบและความคิดเห็นของคุณให้คำตอบกับข้อมูลเพิ่มเติม (ข้อมูลเพิ่มเติมเป็นคำตอบของคุณที่นี่) คุณควรอัปเดตคำตอบของคุณเพื่อระบุว่า express ต้องการตัวแยกวิเคราะห์ร่างกายหรือให้ทางเลือกอื่นเพื่อระบุว่าตัวแยกวิเคราะห์ตัวรับข้อมูลในตอนแรกได้อย่างไร
dewwwald

2
ไม่ได้กำหนดbody
jameshfisher

15

สำหรับผู้ที่ได้รับวัตถุเปล่า req.body

ฉันลืมที่จะตั้ง headers: {"Content-Type": "application/json"} ในคำขอ เปลี่ยนมันแก้ปัญหาได้


ไม่อยากจะเชื่อเลยว่าฉันพลาดสิ่งนี้ไป! ฉันส่งtext/jsonและรับ{}การตอบกลับ รวมการกำกับดูแลในส่วนของฉัน มีประโยชน์มาก
James M. Lay

อืม - ฉันก็พลาดเรื่องนี้เช่นกัน ขอบคุณที่โพสต์ข้อความนี้ดังนั้นฉันจึงไม่เสียเวลามากกว่าที่ฉันมีอยู่!
Steve Gomez

9

@Daniel Thompson กล่าวว่าเขาลืมเพิ่ม {"Content-Type": "application / json"} ในคำขอคำขอเขาสามารถเปลี่ยนคำขอได้อย่างไรก็ตามการเปลี่ยนแปลงคำขอไม่สามารถทำได้เสมอไป (เรากำลังทำงานบนเซิร์ฟเวอร์ที่นี่)

ในกรณีของฉันฉันจำเป็นต้องบังคับชนิดเนื้อหา: ข้อความ / ธรรมดาที่จะแยกเป็น json

หากคุณไม่สามารถเปลี่ยนประเภทเนื้อหาของคำขอลองใช้รหัสต่อไปนี้:

app.use(express.json({type: '*/*'}));

แทนที่จะใช้ express.json () ทั่วโลกฉันต้องการใช้เฉพาะเมื่อจำเป็นเช่นในคำขอ POST:

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.