এক্সপ্রেসজেএস-এর কোনও পৃষ্ঠায় কীভাবে 404 ত্রুটি পুনর্নির্দেশ করবেন?


203

আমি এটি করার জন্য কোনও ফাংশন জানি না, কেউ কি একটির সম্পর্কে জানতে পারে?

উত্তর:


274

আমি এই উদাহরণটি বেশ সহায়ক বলে মনে করেছি:

https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js

সুতরাং এটি আসলে এই অংশ:

// "app.router" positions our routes
// above the middleware defined below,
// this means that Express will attempt
// to match & call routes _before_ continuing
// on, at which point we assume it's a 404 because
// no route has handled the request.

app.use(app.router);

// Since this is the last non-error-handling
// middleware use()d, we assume 404, as nothing else
// responded.

// $ curl http://localhost:3000/notfound
// $ curl http://localhost:3000/notfound -H "Accept: application/json"
// $ curl http://localhost:3000/notfound -H "Accept: text/plain"

app.use(function(req, res, next){
  res.status(404);

  // respond with html page
  if (req.accepts('html')) {
    res.render('404', { url: req.url });
    return;
  }

  // respond with json
  if (req.accepts('json')) {
    res.send({ error: 'Not found' });
    return;
  }

  // default to plain-text. send()
  res.type('txt').send('Not found');
});

"হ্যান্ডলড" সংজ্ঞায়িত করুন? পরিচালিত হিসাবে রুটটি ঠিক কী চিহ্নিত করে?
টিমো হুভিনেন

1
আমার ধারণা ছিল যে সেই বিন্দু পর্যন্ত কোনও মিলবে না route
ফেলিক্স

2
এফওয়াইআই, এর ব্যবহার app.routerএখন অবচিত করা হয়েছে। দেখুন github.com/strongloop/express/wiki/...
iX3

2
জেএসওএন প্রতিক্রিয়াটির res.jsonবদলে এটি ব্যবহার করা ভাল res.send()। তারা আপনার কোডে একই আচরণ res.jsonকরবে তবে ব্যবহার করে অটোকে রূপান্তরকারী বস্তুগুলিতে স্ট্রিংয়ে কিছু জাদু করতে .send()হবে যেখানে হবে না। দুঃখিত চেয়ে ভাল নিরাপদ. expressjs.com/api.html#res.json
ডাব্লুজিপি

9
এখন এই প্রশ্নটি এফএকিউ-তে প্রকাশিত হয় এক্সপ্রেস
ফাফ এইচটিএমএল#

157

আমি মনে করি আপনার প্রথমে আপনার সমস্ত রুট এবং শেষের রুট যুক্ত হিসাবে সংজ্ঞা দেওয়া উচিত

//The 404 Route (ALWAYS Keep this as the last route)
app.get('*', function(req, res){
  res.status(404).send('what???');
});

কাজ করে এমন একটি উদাহরণ অ্যাপ:

app.js:

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

app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res){
  res.send('hello world');
});

//The 404 Route (ALWAYS Keep this as the last route)
app.get('*', function(req, res){
  res.send('what???', 404);
});

app.listen(3000, '127.0.0.1');

alfred@alfred-laptop:~/node/stackoverflow/6528876$ mkdir public
alfred@alfred-laptop:~/node/stackoverflow/6528876$ find .
alfred@alfred-laptop:~/node/stackoverflow/6528876$ echo "I don't find a function for that... Anyone knows?" > public/README.txt
alfred@alfred-laptop:~/node/stackoverflow/6528876$ cat public/README.txt 

.
./app.js
./public
./public/README.txt

alfred@alfred-laptop:~/node/stackoverflow/6528876$ curl http://localhost:3000/
hello world
alfred@alfred-laptop:~/node/stackoverflow/6528876$ curl http://localhost:3000/README.txt
I don't find a function for that... Anyone knows?

6
ঠিক আছে ... সমস্যাটি হ'ল "*" ইতিমধ্যে .js এবং .css ফাইলগুলির সাথে মেলে এবং সেগুলি অ্যাপ্লিকেশনে নির্দিষ্ট করা হয়নি ... ঠিক আছে, ঠিক জানি না কোনও উপায় আছে কিনা আমি জানি না 404 ত্রুটি, বা "পাওয়া যায় না ..." বার্তাটি ওভাররাইট করার একটি উপায়। যাইহোক, আপনাকে ধন্যবাদ

1
আপনি কি স্থির মিডলওয়্যার ব্যবহার করছেন, কারণ এরপরে আপনি এখনও স্ট্যাটিক ফাইলগুলি পরিবেশন করতে পারেন?
আলফ্রেড

4
app.get('/public/*', function(req, res){ res.sendfile(__dirname + '/public/' + req.url); })স্ট্যাটিক ফাইলগুলি প্রেরণের জন্য আপনি এই রুটটি ব্যবহার করতে পারেন। উপরের "*" রুটের সাথে এটি দুর্দান্ত কাজ করে। app.use(express.static(__dirname + '/public'));আমার জন্য কাজ করে না, তারযুক্ত।
ক্রিস

25
এটি আমার পক্ষে কাজ করে না, তবে আমি আবিষ্কার করেছি যে আমার app.use(express.static(...))পরে এসেছে app.use(app.router)। একবার আমি এগুলিকে স্যুইচ করেছিলাম সব ঠিক হয়ে গেছে।
স্টিফেন

5
আপনার উত্তরে @ স্টিফেনের মন্তব্য যুক্ত করার জন্য +1 আমি app.use (app.router) এর পরে অ্যাপ.উস (এক্সপ্রেস.স্ট্যাটিক (...)) না লাগানো পর্যন্ত এটি আমার পক্ষে কার্যকর হয়নি
ব্রেইটস

37

আপনি একটি মিডলওয়্যারকে শেষ অবস্থানে রাখতে পারেন যা NotFoundত্রুটি ছুঁড়ে ফেলে ,
বা 404 পৃষ্ঠাটি সরাসরি সরবরাহ করে:

app.use(function(req,res){
    res.status(404).render('404.jade');
});

9
দয়া করে পরের বারে আরও কিছু ভার্বোজের উত্তর বিবেচনা করুন ... উদাহরণগুলি সাধারণত ভাল হয় - এবং এটি একটি ভাল উদাহরণ - তবে কিছু ব্যাখ্যা খুব ভাল, খুব
ভালও

2
+1 খুব ভাল! আমি মনে করি এটি একটি শেষ রুটের চেয়ে ভাল, কারণ আপনাকে শেষ সময়ে use()আপনার app.routerকাছে যেতে হবে না । (যেমনটি আমার ক্ষেত্রে রয়েছে)
আলবা মেন্ডিজ 13'12

এছাড়াও, এটি কোনও অনুরোধে (কেবলমাত্র নয় GET) ডিফল্ট আচরণকে প্রতিস্থাপন করে । POSTঅন্য পদ্ধতি সহ একটি এলোমেলো ইউআরএল চেষ্টা করুন; এটি ডিফল্ট ফিরে আসবে Cannot POST...। একজন আক্রমণকারী তখন জানতে পারে আপনি এক্সপ্রেস.জেএস ব্যবহার করছেন।
আলবা মেন্ডিজ

খুব ভাল ইজ ব্যবহার না করে আপনাকে কেবল res.render('404')
লিখতে হবে

এটিরও সম্ভবত একটি স্ট্যাটাস থাকতে হবে (404) রেস স্ট্যাটাস (404)। রেন্ডার ('404')
মার্টিন ওয়েব

32

উপরের উত্তরগুলি ভাল, তবে এর অর্ধেকের মধ্যে আপনি 404 পাচ্ছেন না কারণ আপনার HTTP স্থিতি কোডটি ফিরে এসেছে এবং অন্য অর্ধে, আপনি কোনও কাস্টম টেম্পলেট রেন্ডার করতে সক্ষম হবেন না। এক্সপ্রেসজে একটি কাস্টম ত্রুটি পৃষ্ঠা (404 এর) থাকার সর্বোত্তম উপায়

app.use(function(req, res, next){
    res.status(404).render('404_error_template', {title: "Sorry, page not found"});
});

আপনার সমস্ত URL ম্যাপিংয়ের শেষে এই কোডটি রাখুন।


@ সুশান্তগুপ্ত - 'বৈধ অস্তিত্বের ইউআরএল ম্যাপিংস' বলতে কী বোঝ?
জোনাথন বেচটেল

@ জোনাথনবেটেল যেমন আপনার অনুলিপি ইউআরএল রুট পরে উপরের কোড ব্লক আছে।
সুশান্ত গুপ্ত 10

6

App.js এর শেষ লাইনে এই ফাংশনটি ঠিক রেখে দিন। এটি ডিফল্ট পৃষ্ঠা-না পাওয়া-পাওয়া ত্রুটি পৃষ্ঠাকে ওভাররাইড করবে:

app.use(function (req, res) {
    res.status(404).render('error');
});

এটি এমন সমস্ত অনুরোধকে ওভাররাইড করবে যাতে বৈধ হ্যান্ডলার নেই এবং আপনার নিজস্ব ত্রুটি পৃষ্ঠা রেন্ডার করবে।


2
এটি আপনার "অ্যাপ্লিকেশন.জেএস এর শেষ লাইন" মন্তব্য যা সাহায্য করেছিল! ধন্যবাদ!
C0NFUS3D

আমার অ্যাপটিতে একটি বৈশিষ্ট্য যুক্ত করা হয়েছে। ধন্যবাদ :)
প্রদীপ বাজরাচার্য

5

আপনার প্রশ্নের উত্তরটি হ'ল:

app.use(function(req, res) {
    res.status(404).end('error');
});

এটি কেন এখানে সেরা উপায় তা সম্পর্কে একটি দুর্দান্ত নিবন্ধ রয়েছে ।


1
মধ্যে পার্থক্য কি sendএবং end?
টিমো হুভিনেন

আমার মনে হয় তার মিস- send
রাইটিংটি

4

এক্সপ্রেস-ত্রুটি-হ্যান্ডলার আপনাকে ত্রুটিগুলির জন্য কাস্টম টেম্পলেট, স্থির পৃষ্ঠাগুলি বা ত্রুটি হ্যান্ডলারগুলি নির্দিষ্ট করতে দেয়। এটি অন্যান্য দরকারী ত্রুটি-পরিচালনার জিনিসগুলিও করে যা প্রতিটি অ্যাপ্লিকেশনটি কার্যকর করা উচিত, যেমন 4XX ত্রুটি ডস আক্রমণ থেকে রক্ষা এবং অপরিবর্তনযোগ্য ত্রুটিগুলিতে চমত্কার শাটডাউন। আপনি যা চাইছেন তা আপনি এখানে কীভাবে করবেন:

var errorHandler = require('express-error-handler'),
  handler = errorHandler({
    static: {
      '404': 'path/to/static/404.html'
    }
  });

// After all your routes...
// Pass a 404 into next(err)
app.use( errorHandler.httpError(404) );

// Handle all unhandled errors:
app.use( handler );

বা কাস্টম হ্যান্ডলারের জন্য:

handler = errorHandler({
  handlers: {
    '404': function err404() {
      // do some custom thing here...
    }
  }
}); 

বা একটি কাস্টম দর্শন জন্য:

handler = errorHandler({
  views: {
    '404': '404.jade'
  }
});

4

কিছু ক্ষেত্রে রয়েছে যেখানে 404 পৃষ্ঠাটি শেষ রুট হিসাবে সম্পাদন করার জন্য লেখা যায় না, বিশেষত আপনার যদি একটি অ্যাসিনক্রোনাস রাউটিং ফাংশন থাকে যা পার্টিতে দেরী / রুটে নিয়ে আসে। এই ক্ষেত্রে নীচের প্যাটার্নটি গ্রহণ করা যেতে পারে।

var express = require("express.io"),
    app = express(),
    router = express.Router();

router.get("/hello", function (req, res) {
    res.send("Hello World");
});

// Router is up here.
app.use(router);

app.use(function(req, res) {
    res.send("Crime Scene 404. Do not repeat");
});

router.get("/late", function (req, res) {
    res.send("Its OK to come late");
});

app.listen(8080, function (){
    console.log("Ready");
});

2
উজ্জ্বল, আপনাকে ধন্যবাদ! একমাত্র উত্তর (?) যা এক্সপ্রেসের রৈখিক প্রসেসিংয়ের উপর নির্ভর করে না (যেমন "কেবল ত্রুটি হ্যান্ডলারটি শেষে রাখুন")।
নিক গ্রেলে


2
// Add this middleware
// error handler
app.use(function(err, req, res, next) {
 // set locals, only providing error in development
   res.locals.message = err.message;
   res.locals.error = req.app.get('env') === 'development' ? err : {};

 // render the error page
   res.status(err.status || 500);
   res.render('error');
  });

2

এটি করার সহজতম উপায় হ'ল ত্রুটি পৃষ্ঠার জন্য সমস্ত ধরা

// Step 1: calling express
const express = require("express");
const app = express();

তারপর

// require Path to get file locations
const path = require("path");

এখন আপনি আপনার সমস্ত "এইচটিএমএল" পৃষ্ঠা (একটি ত্রুটি "এইচটিএমএল" পৃষ্ঠা সহ) একটি ভেরিয়েবলে সঞ্চয় করতে পারেন

// Storing file locations in a variable
var indexPg = path.join(__dirname, "./htmlPages/index.html");
var aboutPg = path.join(__dirname, "./htmlPages/about.html");
var contactPg = path.join(__dirname, "./htmlPages/contact.html");
var errorPg = path.join(__dirname, "./htmlPages/404.html"); //this is your error page

এখন আপনি সহজভাবে মেথড পদ্ধতিটি ব্যবহার করে পৃষ্ঠাগুলি কল করুন এবং অ্যাপ্লিকেশন ব্যবহার করে আপনার ত্রুটি পৃষ্ঠায় সরাসরি পৌঁছানোর জন্য উপলভ্য নয় এমন কোনও রুটের জন্য সমস্ত কিছু ধরুন "(" * ")

//Step 2: Defining Routes
//default page will be your index.html
app.get("/", function(req,res){
  res.sendFile(indexPg);
});
//about page
app.get("/about", function(req,res){
  res.sendFile(aboutPg);
});
//contact page
app.get("/contact", function(req,res){
  res.sendFile(contactPg);
});
//catch all endpoint will be Error Page
app.get("*", function(req,res){
  res.sendFile(errorPg);
});

একটি পোর্ট সেট আপ করতে এবং সার্ভারের জন্য শুনতে ভুলবেন না:

// Setting port to listen on
const port = process.env.PORT || 8000;
// Listening on port
app.listen(port, function(){
  console.log(`http://localhost:${port}`);
})

এটি এখন সমস্ত অচেনা শেষ পয়েন্টগুলির জন্য আপনার ত্রুটি পৃষ্ঠাটি দেখানো উচিত!


1

উপরের উত্তরগুলি সঠিক হলেও, যারা আইআইএসএনওডিতে এই কাজ করতে চান তাদের জন্য আপনাকেও উল্লেখ করতে হবে

<configuration>
    <system.webServer>
        <httpErrors existingResponse="PassThrough"/>
    </system.webServer>
<configuration>

আপনার ওয়েবকনফাইগে (অন্যথায় আইআইএস আপনার আউটপুট খাবে)।


2
ধন্যবাদ!!! ইন্টারনেটে আপনিই কেবল যারা জানেন যে (বা কমপক্ষে এটি ভাগ করুন) জানেন! চিয়ার্স
আন্দ্রে লুকাস

1

আপনি কন্টেন্ট-টাইপ অনুযায়ী পরিচালনা করতে ত্রুটি করতে পারেন

অতিরিক্তভাবে, স্থিতি কোড অনুযায়ী পরিচালনা করা।

app.js

import express from 'express';

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// when status is 404, error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    if( 404 === err.status  ){
        res.format({
            'text/plain': () => {
                res.send({message: 'not found Data'});
            },
            'text/html': () => {
                res.render('404.jade');
            },
            'application/json': () => {
                res.send({message: 'not found Data'});
            },
            'default': () => {
                res.status(406).send('Not Acceptable');
            }
        })
    }

    // when status is 500, error handler
    if(500 === err.status) {
        return res.send({message: 'error occur'});
    }
});

404.jade

doctype html

html
  head
    title 404 Not Found

    meta(http-equiv="Content-Type" content="text/html; charset=utf-8")
    meta(name = "viewport" content="width=device-width, initial-scale=1.0 user-scalable=no")

  body
      h2 Not Found Page
      h2 404 Error Code

যদি আপনি রেজ.ফর্ম্যাট ব্যবহার করতে পারেন তবে আপনি সাধারণ ত্রুটি পরিচালনা কোডটি লিখতে পারেন।

res.format()পরিবর্তে সুপারিশ res.accepts()

যদি আগের কোডটিতে 500 ত্রুটি দেখা দেয় if(500 == err.status){. . . }তবে তাকে ডাকা হয়


1

হাই দয়া করে উত্তর সন্ধান করুন

const express = require('express');
const app = express();
const port = 8080;

app.get('/', (req, res) => res.send('Hello home!'));
app.get('/about-us', (req, res) => res.send('Hello about us!'));
app.post('/user/set-profile', (req, res) => res.send('Hello profile!'));
//last 404 page 
app.get('*', (req, res) => res.send('Page Not found 404'));
app.listen(port, () => console.log(`Example app listening on port ${port}!`));

0

আপনি যদি এক্সপ্রেস-জেনারেটর প্যাকেজ ব্যবহার করেন:

পরবর্তী (মাত্রই ভুল করে);

এই কোডটি আপনাকে 404 মিডলওয়্যারের কাছে প্রেরণ করবে।


0

একটি কাস্টম পৃষ্ঠায় প্রেরণ:

app.get('*', function(req, res){
  if (req.accepts('html')) {
     res.send('404', '<script>location.href = "/the-404-page.html";</script>');
     return;
  }
});

0

আমি স্থির .ejsফাইলের সাহায্যে 404 ত্রুটিটি হ্যান্ডেল করতে নীচের হ্যান্ডলারটি ব্যবহার করেছি ।

একটি রুট লিপিতে এই কোড রাখুন এবং তারপর প্রয়োজন যে file.jsমাধ্যমে app.use()আপনার app.js/ server.js/ www.js(NodeJS জন্য IntelliJ ব্যবহার করে থাকেন)

আপনি একটি স্ট্যাটিক .htmlফাইলও ব্যবহার করতে পারেন ।

//Unknown route handler
 router.get("[otherRoute]", function(request, response) {
     response.status(404);
     response.render("error404.[ejs]/[html]");
     response.end();
 });

এইভাবে, চলমান এক্সপ্রেস সার্ভারটি যথাযথভাবে প্রতিক্রিয়া জানাবে 404 errorএবং আপনার ওয়েবসাইটটিতে এমন একটি পৃষ্ঠাও অন্তর্ভুক্ত থাকতে পারে যা সার্ভারের 404 প্রতিক্রিয়া সঠিকভাবে প্রদর্শন করে। এছাড়াও আপনি একটি অন্তর্ভুক্ত করতে পারে navbarযে 404 error templateআপনার ওয়েবসাইটের অন্যান্য গুরুত্বপূর্ণ কন্টেন্ট যে লিঙ্ক।


0

আপনি যদি নিজের ফাংশন (রুট) থেকে ত্রুটি পৃষ্ঠাগুলিতে পুনর্নির্দেশ করতে চান তবে নিম্নলিখিত জিনিসগুলি করুন -

  1. আপনার অ্যাপ্লিকেশনগুলিতে সাধারণ ত্রুটি বার্তাগুলি কোড যুক্ত করুন -

    app.use(function(err, req, res, next) {
        // set locals, only providing error in development
        res.locals.message = err.message
        res.locals.error = req.app.get('env') === 'development' ? err : {}
    
        // render the error page
        // you can also serve different error pages
        // for example sake, I am just responding with simple error messages 
        res.status(err.status || 500)
       if(err.status === 403){
           return res.send('Action forbidden!');
       }
    
       if(err.status === 404){
           return res.send('Page not found!');
       }
    
       // when status is 500, error handler
       if(err.status === 500) {
           return res.send('Server error occured!');
       }
       res.render('error')
    })
  2. আপনার কার্যক্রমে, ত্রুটি-পৃষ্ঠা পুনর্নির্দেশের পরিবর্তে আপনি প্রথমে ত্রুটির স্থিতি সেট করতে এবং তারপরে কোডটি প্রবাহের জন্য উপরের কোডটি দিয়ে যেতে ব্যবহার করতে পারেন -

    if(FOUND){
        ...
    }else{
        // redirecting to general error page
        // any error code can be used (provided you have handled its error response)
        res.status(404)
        // calling next() will make the control to go call the step 1. error code
        // it will return the error response according to the error code given (provided you have handled its error response)
        next()
    }

0

40. পৃষ্ঠাটি অ্যাপ্লিকেশনকে কল করার ঠিক আগে সেটআপ করা উচিত E এক্সপ্রেসের রুট পাথগুলিতে * এর জন্য সমর্থন রয়েছে। এটি একটি বিশেষ চরিত্র যা কোনও কিছুর সাথে মেলে। এটি সমস্ত অনুরোধের সাথে মেলে এমন একটি রুট হ্যান্ডলার তৈরি করতে ব্যবহার করা যেতে পারে।

app.get('*', (req, res) => {
  res.render('404', {
    title: '404',
    name: 'test',
    errorMessage: 'Page not found.'
  })
})

0

সমস্ত HTTP ক্রিয়াকলাপের মধ্যে আবরণ express

সমস্ত HTTP ক্রিয়াকলাপ এবং আপনি ব্যবহার করতে পারেন এমন সমস্ত পাথ কভার করার জন্য :

app.all('*', cb)

চূড়ান্ত সমাধান এর মত দেখতে হবে:

app.all('*', (req, res) =>{
    res.status(404).json({
        success: false,
        data: '404'
    })
})

আপনি রাউটারটি শেষ পর্যন্ত রাখতে ভুলবেন না। কারণ রাউটারের অর্ডার ব্যাপার।


0

উপরের কোডটি আমার পক্ষে কাজ করে নি।

সুতরাং আমি একটি নতুন সমাধান পেয়েছি যা আসলে কাজ করে!

app.use(function(req, res, next) {
    res.status(404).send('Unable to find the requested resource!');
});

অথবা আপনি এটিকে 404 পৃষ্ঠায়ও সরবরাহ করতে পারেন।

app.use(function(req, res, next) {
    res.status(404).render("404page");
});

আশা করি এটি আপনাকে সাহায্য করেছে!


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.