วิธีที่เหมาะสมในการตั้งค่าสถานะการตอบสนองและเนื้อหา JSON ใน REST API ที่สร้างด้วย nodejs และ express


187

ฉันกำลังเล่นกับ Nodejs และแสดงโดยการสร้าง API พักผ่อนขนาดเล็ก คำถามของฉันคือวิธีปฏิบัติที่ดี / วิธีที่ดีที่สุดในการกำหนดสถานะโค้ดรวมถึงข้อมูลการตอบกลับคืออะไร

ให้ฉันอธิบายด้วยรหัสเล็กน้อย (ฉันจะไม่ใส่โหนดและรหัสด่วนที่จำเป็นในการเริ่มต้นเซิร์ฟเวอร์เพียงวิธีเราเตอร์ที่เกี่ยวข้อง):

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  res.json(user);
});


exports.getUserById = function(id) {
  for (var i = 0; i < users.length; i++) {
    if (users[i].id == id) return users[i];
  }
};

รหัสด้านล่างทำงานได้อย่างสมบูรณ์และเมื่อส่งคำขอกับบุรุษไปรษณีย์ฉันได้รับผลลัพธ์ดังต่อไปนี้: ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็นสถานะแสดงเป็น 200 ซึ่งก็โอเค แต่นี่เป็นวิธีที่ดีที่สุดในการทำสิ่งนี้? มีกรณีที่ฉันควรจะต้องตั้งสถานะตัวเองเช่นเดียวกับ JSON กลับมา? หรือว่าจัดการโดยด่วนเสมอ?

ตัวอย่างเช่นฉันเพิ่งทำการทดสอบอย่างรวดเร็วและปรับเปลี่ยนวิธีการรับด้านบนเล็กน้อย:

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  if (user == null || user == 'undefined') {
    res.status(404);
  }
  res.json(user);
});

อย่างที่คุณเห็นหากผู้ใช้ไม่พบในอาเรย์ฉันจะตั้งสถานะเป็น 404

ทรัพยากร / คำแนะนำเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับหัวข้อนี้เป็นมากกว่าการต้อนรับ


3
นี่คือคำตอบที่ได้รับคะแนนสูงสุดของฉันและไม่เป็นที่ยอมรับ :( @dukable ฉันรู้ว่าไม่นานมานี้ แต่มันช่วยแก้ปัญหาของคุณได้ไหม?
Michał Dudak

@ MichałDudak: ใช่คำตอบของคุณควรเป็นคำตอบที่ยอมรับได้ แต่ผู้ใช้ dukable นี้จะไม่ทำงานตั้งแต่วันที่ 15 ตุลาคม 2015 (ณ วันที่ 31 กรกฎาคม 2017) +1 สำหรับคำตอบของคุณอย่างไรก็ตาม)
Amol M Kulkarni

คำตอบ:


230

การอ้างอิง Express API ครอบคลุมถึงกรณีนี้

ดูสถานะและส่ง

ในระยะสั้นคุณต้องโทรstatusวิธีก่อนโทรjsonหรือsend:

res.status(500).send({ error: "boo:(" });

32
หากคุณต้องการส่งรหัสสถานะเท่านั้น (ไม่มีข้อมูล) วิธีนี้จะเป็นres.sendStatus(400);
internet-nico

3
ดูเหมือนจะไม่ทำงานอีกต่อไป การตอบสนองจะถูกส่งไปพร้อมกับรหัสสถานะที่ถูกต้อง แต่ไม่มีเนื้อความ ....
LondonRob

2
ละเว้นความคิดเห็นล่าสุดของฉัน หากคุณตั้งค่าสถานะเป็น 204 (ไม่มีเนื้อหา) จะไม่ส่งเนื้อหา
LondonRob

2
@ internet-nico res.sendStatus(400);ส่งข้อมูลสตริงด้วยเช่นกันres.status(400).send('Not Found')
Davide

74

คุณสามารถทำได้ด้วยวิธีนี้:

res.status(400).json(json_response);

นี่จะตั้งรหัสสถานะ HTTP เป็น 400 มันใช้งานได้แม้ใน express 4


17
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead ดังนั้นres.status(400).json(json_response)จะแม่นยำในปัจจุบัน
Will Luce

ใช่ขอบคุณ ... มันถูกทำเครื่องหมายว่าเลิกใช้แล้ว แต่ยังใช้งานได้: P ความคิดเห็นของคุณถูกต้องจุดดี
mzalazar

ในความโปรดปรานของ anwer -res.status(500).send({ error: "boo:(" });
prayagupd

41

สถานะของ 200 จะเริ่มต้นเมื่อใช้res.send, res.jsonฯลฯ

คุณสามารถตั้งค่าสถานะเช่น res.status(500).json({ error: 'something is wrong' });

บ่อยครั้งฉันจะทำสิ่งที่ชอบ ...

router.get('/something', function(req, res, next) {
  // Some stuff here
  if(err) {
    res.status(500);
    return next(err);
  }
  // More stuff here
});

จากนั้นให้มิดเดิลแวร์ข้อผิดพลาดของฉันส่งการตอบกลับและทำสิ่งอื่นที่ฉันต้องทำเมื่อมีข้อผิดพลาด

นอกจากนี้: res.sendStatus(status)ได้รับการเพิ่มเป็นเวอร์ชัน4.9.0 http://expressjs.com/4x/api.html#res.sendStatus


23

รายการรหัสสถานะ HTTP

แนวปฏิบัติที่ดีเกี่ยวกับการตอบกลับสถานะคือคาดการณ์ส่งรหัสสถานะ HTTP ที่เหมาะสมขึ้นอยู่กับข้อผิดพลาด (4xx สำหรับข้อผิดพลาดของลูกค้า 5xx สำหรับข้อผิดพลาดของเซิร์ฟเวอร์) เกี่ยวกับการตอบสนอง JSON จริงไม่มี "พระคัมภีร์" แต่เป็นความคิดที่ดี เพื่อส่ง (อีกครั้ง) สถานะและข้อมูลเป็น 2 คุณสมบัติที่แตกต่างกันของวัตถุรูทในการตอบสนองที่ประสบความสำเร็จ (ด้วยวิธีนี้คุณจะให้โอกาสลูกค้าในการจับภาพสถานะจากส่วนหัว HTTP และเพย์โหลดเอง) และคุณสมบัติที่ 3 ข้อผิดพลาดในวิธีที่มนุษย์เข้าใจได้ในกรณีที่เกิดข้อผิดพลาด

API ของ Stripeทำงานในทำนองเดียวกันในโลกแห่งความเป็นจริง

กล่าวคือ

ตกลง

200, {status: 200, data: [...]}

ความผิดพลาด

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}

13

ฉันใช้สิ่งนี้ในแอปพลิเคชัน Express.js ของฉัน:

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});

5

วิธีมาตรฐานในการรับ HttpResponse แบบเต็มซึ่งรวมถึงคุณสมบัติต่อไปนี้

  1. body // มีข้อมูลของคุณ
  2. ส่วนหัว
  3. ตกลง
  4. สถานะ
  5. statusText
  6. ชนิด
  7. URL

ในแบ็กเอนด์ทำสิ่งนี้

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

ในFrontendเช่นAngularทำเพียง:

let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})




0

วิธีที่ดีที่สุดในการส่งการตอบกลับข้อผิดพลาดreturn res.status(400).send({ message: 'An error has occurred' })คือ

จากนั้นในส่วนหน้าของคุณคุณสามารถจับมันโดยใช้สิ่งนี้:

        url: your_url,
        method: 'POST',
        headers: headers,
        data: JSON.stringify(body),
    })
        .then((res) => {
            console.log('success', res);
        })
        .catch((err) => {
            err.response && err.response.data && this.setState({ apiResponse: err.response.data })
        })

การเข้าสู่ระบบเพียงแค่จะไม่ทำงานส่งเป็นข้อความวัตถุอยู่ในerrerr.response.data

หวังว่าจะช่วย!

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