จะระบุรหัสข้อผิดพลาด HTTP ได้อย่างไร


161

ฉันเหนื่อย:

app.get('/', function(req, res, next) {
    var e = new Error('error message');
    e.status = 400;
    next(e);
});

และ:

app.get('/', function(req, res, next) {
    res.statusCode = 400;
    var e = new Error('error message');
    next(e);
});

แต่จะมีการประกาศรหัสข้อผิดพลาด 500 เสมอ


1
คำตอบของฉันสำหรับคำถามที่เกี่ยวข้องสามารถช่วยได้: stackoverflow.com/questions/10170857/…
Pickels

2
คุณช่วยอัพเดทการตอบรับที่ยอมรับได้ไหม
Dan Mandle

คำตอบ:


293

สำหรับเอกสาร Express (เวอร์ชัน 4+) คุณสามารถใช้:

res.status(400);
res.send('None shall pass');

http://expressjs.com/4x/api.html#res.status

<= 3.8

res.statusCode = 401;
res.send('None shall pass');

37
+1 สำหรับการใช้ API เวอร์ชันล่าสุด ถ้าคุณต้องการที่จะส่งลวดมากขึ้นเพียงแค่ห่วงโซ่:res.status(400).json({ error: 'message' })
TyMayn

1
@Mikel หากคุณไม่มีตัวแปรการตอบสนองคุณจะไม่สามารถตอบกลับได้
Dan Mandle

1
res.sendStatus(401);นี้จะเลิกทั้งหมดในขณะนี้คุณควรใช้
Cipi

1
res.send('Then you shall die')การตอบสนองนี้จะเป็นจำนวนมากที่สมบูรณ์มากขึ้นถ้ามันจบลงด้วย
สอบเทียบที่ดี

1
@Cipi คุณมีแหล่งที่มาสำหรับสิ่งนั้นหรือไม่? เอกสารไม่ได้ระบุว่า.status()เลิกใช้แล้ว .sendStatus()เป็นเพียงชื่อย่อสำหรับ.status(code).send(codeName)ที่codeNameเป็นข้อความการตอบสนอง HTTP codeมาตรฐานที่กำหนด
James Coyle


20

ฉันต้องการรวมศูนย์การสร้างการตอบสนองข้อผิดพลาดด้วยวิธีนี้:

app.get('/test', function(req, res){
  throw {status: 500, message: 'detailed message'};
});

app.use(function (err, req, res, next) {
  res.status(err.status || 500).json({status: err.status, message: err.message})
});

ดังนั้นฉันจึงมีรูปแบบเอาต์พุตข้อผิดพลาดเดียวกันเสมอ

PS: แน่นอนคุณสามารถสร้างวัตถุเพื่อขยายข้อผิดพลาดมาตรฐานเช่นนี้

const AppError = require('./lib/app-error');
app.get('/test', function(req, res){
  throw new AppError('Detail Message', 500)
});

'use strict';

module.exports = function AppError(message, httpStatus) {
  Error.captureStackTrace(this, this.constructor);
  this.name = this.constructor.name;
  this.message = message;
  this.status = httpStatus;
};

require('util').inherits(module.exports, Error);

16

คุณสามารถใช้res.send('OMG :(', 404);เพียงres.send(404);


แต่ฉันต้องการให้รหัสข้อผิดพลาดถูกส่งไปที่ eventHandler middleware ดังนั้นหน้าแสดงข้อผิดพลาดที่กำหนดเองของ express จะแสดงขึ้นมา
เทคโนโลยีชาย

12
สำหรับทุกคนที่อ่านข้อความนี้ในปี 2559: ตาม Express 4.x res.send(404)จะถูกคัดค้าน res.sendStatus(404)ก็ตอนนี้ expressjs.com/th/api.html#res.sendStatus
0xRm

12

ใน express 4.0 พวกเขาเข้าใจถูกต้อง :)

res.sendStatus(statusCode)
// Sets the response HTTP status code to statusCode and send its string representation as the response body.

res.sendStatus(200); // equivalent to res.status(200).send('OK')
res.sendStatus(403); // equivalent to res.status(403).send('Forbidden')
res.sendStatus(404); // equivalent to res.status(404).send('Not Found')
res.sendStatus(500); // equivalent to res.status(500).send('Internal Server Error')

//If an unsupported status code is specified, the HTTP status is still set to statusCode and the string version of the code is sent as the response body.

res.sendStatus(2000); // equivalent to res.status(2000).send('2000')

11

เวอร์ชันของ errorHandler มิดเดิลแวร์ที่มาพร้อมกับ express (บางส่วนอาจจะเก่ากว่า) ของ express ดูเหมือนว่าจะมีรหัสสถานะ hardcoded เวอร์ชันที่บันทึกไว้ที่นี่: http://www.senchalabs.org/connect/errorHandler.htmlในทางกลับกันจะช่วยให้คุณทำสิ่งที่คุณพยายามทำ ดังนั้นอาจลองอัปเกรดเป็น express / connect รุ่นล่าสุด


9

จากสิ่งที่ฉันเห็นใน Express 4.0 มันใช้งานได้สำหรับฉัน นี่คือตัวอย่างของมิดเดิลแวร์ที่จำเป็นสำหรับการพิสูจน์ตัวตน

function apiDemandLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on
    console.log('isAuth', req.isAuthenticated(), req.user);
    if (req.isAuthenticated())
        return next();

    // If not return 401 response which means unauthroized.
    var err = new Error();
    err.status = 401;
    next(err);
}

8

คำถามเก่า แต่ยังคงมาใน Google ในเวอร์ชันปัจจุบันของ Express (3.4.0) คุณสามารถเปลี่ยน res.statusCode ก่อนโทรถัดไป (err):

res.statusCode = 404;
next(new Error('File not found'));

ต่อไปจะทำอะไร?
Steve K

nextกำลังเรียกตัวจัดการต่อไปซึ่งใน express.js มักจะพยายามแสดงหน้าข้อผิดพลาด
Kurotsuki

2

แสดง res.send ที่เลิกใช้แล้ว (ร่างกาย, สถานะ) ใช้ res.status (สถานะ) ส่ง (เนื้อหา) แทน


2

ฉันเหนื่อย

res.status(400);
res.send('message');

.. แต่มันก็ทำให้ฉันมีข้อผิดพลาด :

(โหนด: 208) UnhandledPromiseRejectionWarning: ข้อผิดพลาด: ไม่สามารถตั้งค่าส่วนหัวหลังจากที่พวกเขาถูกส่ง

งานนี้สำหรับฉัน

res.status(400).send(yourMessage);

0

ฉันขอแนะนำให้จัดการกับการส่งรหัสข้อผิดพลาด http โดยใช้แพ็คเกจBoom

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