प्रोग्राम / एक्सप्रेस / नोड के साथ 404 प्रतिक्रिया कैसे भेजें?


185

मैं अपने एक्सप्रेस / नोड सर्वर पर 404 त्रुटि का अनुकरण करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?


7
"नकली" एक "वास्तविक" से कैसे भिन्न होगा?
जॉन हन्ना

जवाबों:


273

आजकल प्रतिक्रिया वस्तु पर इसके लिए एक समर्पित statusकार्य है । कॉल करने से पहले बस इसे कहीं पर चेन कर लें send

res.status(404)        // HTTP status 404: NotFound
   .send('Not found');

7
यह भी प्रदान किए गए पृष्ठों के साथ काम करता है:res.status(404).render('error404')
jmu

20
यह ध्यान देने योग्य है कि यह अपने आप में res.status(404);एक प्रतिक्रिया AFAIK नहीं है। इसे या तो किसी चीज़, जैसे res.status(404).end();या आपके दूसरे उदाहरण के साथ जंजीर में बांधने की ज़रूरत है, या इसके बाद इसका अनुसरण करने की ज़रूरत है res.end();, जैसेres.send('Not found');
UpTheCreek

1
@UpTheCreek, मैं उस भ्रम की संभावना से बचने के लिए कोड से पहला उदाहरण निकालूंगा।
आकर्षित नोक

1
छोटा संस्करणres.sendStatus(404)
बेंटेश

47

एक्सप्रेस 4.x के लिए अद्यतन उत्तर

res.send(404)एक्सप्रेस के पुराने संस्करणों के रूप में उपयोग करने के बजाय , नई विधि है:

res.sendStatus(404);

एक्सप्रेस "नहीं मिला" पाठ के साथ बहुत ही मूल 404 प्रतिक्रिया भेजेगा:

HTTP/1.1 404 Not Found
X-Powered-By: Express
Vary: Origin
Content-Type: text/plain; charset=utf-8
Content-Length: 9
ETag: W/"9-nR6tc+Z4+i9RpwqTOwvwFw"
Date: Fri, 23 Oct 2015 20:08:19 GMT
Connection: keep-alive

Not Found

1
मुझे पूरा यकीन है कि यह अभी res.status(404)नहीं है res.sendStatus(404)
जेक विल्सन

4
res.sendStatus(404)सही है। यह बराबर हैres.status(404).send()
जस्टिन जॉनसन

2
हां res.sendStatus(404); के बराबर है res.status(404).send('Not Found')
रिक

@JakeWilson अब यह क्या है ??
कालांश

43

आपको इसका अनुकरण नहीं करना है। res.sendमेरा मानना ​​है कि दूसरा तर्क स्थिति कोड है। उस तर्क के लिए बस 404 पास करें।

मुझे स्पष्ट करना चाहिए कि: expressjs.org पर प्रलेखन के अनुसार ऐसा लगता है कि किसी भी संख्या को पारित करने के res.send()लिए स्थिति कोड के रूप में व्याख्या की जाएगी। तो तकनीकी रूप से आप दूर हो सकते हैं:

res.send(404);

संपादित करें: मेरा बुरा, मैं के resबजाय मतलब था req। इसे प्रतिक्रिया पर बुलाया जाना चाहिए

संपादित करें: एक्सप्रेस 4 के अनुसार, send(status)विधि को हटा दिया गया है। यदि आप एक्सप्रेस 4 या बाद का उपयोग कर रहे हैं, तो इसका उपयोग करें: res.sendStatus(404)इसके बजाय। (टिप्पणी में टिप के लिए थैंक्यू @badcc)


1
आप 404 के साथ एक संदेश भी भेज सकते हैं: res.send(404, "Could not find ID "+id)
पाइलिनक्स

सीधे एक स्थिति कोड भेजना 4.x में पदावनत किया गया है और संभवतः किसी बिंदु पर हटा दिया जाएगा। छड़ी के साथ सर्वश्रेष्ठ.status(404).send('Not found')
मैट फ्लेचर

2
एक्सप्रेस 4 के लिए: "एक्सप्रैस किए गए res.send (स्टेटस) को एक्सप्रेस करें: इसके बजाय res.sendStatus (स्टेटस) का उपयोग करें"
badcc

10

साइट के अनुसार मैं नीचे पोस्ट करूँगा, यह सब है कि आप अपना सर्वर कैसे सेट करते हैं। एक उदाहरण वे दिखाते हैं:

var http = require("http");
var url = require("url");

function start(route, handle) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    route(handle, pathname, response);
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

और उनका मार्ग कार्य:

function route(handle, pathname, response) {
  console.log("About to route a request for " + pathname);
  if (typeof handle[pathname] === 'function') {
    handle[pathname](response);
  } else {
    console.log("No request handler found for " + pathname);
    response.writeHead(404, {"Content-Type": "text/plain"});
    response.write("404 Not found");
    response.end();
  }
}

exports.route = route;

ये एक तरीका है। http://www.nodebeginner.org/

किसी अन्य साइट से, वे एक पेज बनाते हैं और फिर उसे लोड करते हैं। यह वही हो सकता है जो आप ढूंढ रहे हैं।

fs.readFile('www/404.html', function(error2, data) {
            response.writeHead(404, {'content-type': 'text/html'});
            response.end(data);
        });

http://blog.poweredbyalt.net/?p=81


9

से एक्सप्रेस साइट , एक NotFound अपवाद को परिभाषित करने और फेंक जब भी आप मामले नीचे में एक 404 पृष्ठ या / 404 के लिए पुन: निर्देशन करना चाहते हैं:

function NotFound(msg){
  this.name = 'NotFound';
  Error.call(this, msg);
  Error.captureStackTrace(this, arguments.callee);
}

NotFound.prototype.__proto__ = Error.prototype;

app.get('/404', function(req, res){
  throw new NotFound;
});

app.get('/500', function(req, res){
  throw new Error('keyboard cat!');
});

1
यह उदाहरण कोड अब आपके द्वारा संदर्भित लिंक पर नहीं है। क्या यह एक्सप्रेस के पुराने संस्करण पर लागू हो सकता है?
ड्रू नोक

यह वास्तव में मौजूदा कोड पर स्टिल लागू होता है, आपको बस इतना करना है कि त्रुटि को पकड़ने के लिए मिडिलवेयर का उपयोग करें। Ex:app.use(function(err, res, res, next) { if (err.message.indexOf('NotFound') !== -1) { res.status(400).send('Not found dude'); }; /* else .. etc */ });
एलेसियोलेक्स

0

IMO सबसे अच्छा तरीका next()फ़ंक्शन का उपयोग करना है:

router.get('/', function(req, res, next) {
    var err = new Error('Not found');
    err.status = 404;
    return next(err);
}

फिर त्रुटि को आपके त्रुटि हैंडलर द्वारा नियंत्रित किया जाता है और आप HTML का उपयोग करके त्रुटि को अच्छी तरह से स्टाइल कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.