如何将404错误重定向到ExpressJS中的页面?

我不知道这样做的函数,有人知道吗?

346448 次浏览

我认为你应该首先定义你所有的路线,然后作为最后的路线添加

//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?
你可以把一个中间件放在最后一个抛出NotFound错误的位置,
甚至直接呈现404页面:

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

我发现这个例子很有帮助:

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.json({ error: 'Not found' });
return;
}


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

虽然上面的答案是正确的,但对于那些希望在IISNODE中工作的人来说,还需要指定

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

在你的网里。配置(否则IIS将吃掉您的输出)。

在app.js的最后一行放入这个函数。这将覆盖默认的page-not-found错误页面:

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

它将覆盖没有有效处理程序的所有请求,并呈现您自己的错误页面。

上面的答案很好,但其中一半的答案不会返回404作为HTTP状态代码,而另一半答案则不能呈现自定义模板。在Expressjs中拥有自定义错误页面(404)的最佳方法是

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

将此代码放在所有URL映射的末尾。

你问题的答案是:

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

有一篇很棒的文章讲述了为什么它是最好的方法在这里

express-error-handler允许您为错误指定自定义模板、静态页面或错误处理程序。它还做了其他有用的错误处理,每个应用程序都应该实现,比如防止4xx错误DOS攻击,以及在不可恢复错误时优雅地关闭。以下是你如何做到你所要求的:

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'
}
});

在某些情况下,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");
});

如果您使用express-generator包:

下一个(错);

这段代码将您发送到404中间件。

发送到自定义页面:

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

我使用下面的处理程序来处理静态.ejs文件中的404错误。

把这段代码放在一个路由脚本中,然后在你的app.js/server.js/www.js中要求file.jsapp.use()(如果使用IntelliJ for NodeJS)

你也可以使用静态的.html文件。

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

这样,运行中的快速服务器将以正确的404 error响应,并且您的网站还可以包括一个正确显示服务器的404响应的页面。你也可以在404 error template中包含一个navbar,它可以链接到你网站的其他重要内容。

app.get('*',function(req,res){
res.redirect('/login');
});

可以根据内容类型进行错误处理

此外,根据状态代码进行处理。

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.format()代替res.accepts()

如果在前面的代码中出现500错误,则调用if(500 == err.status){. . . }

做到这一点最简单的方法是为错误页提供一个捕捉

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

然后

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

现在您可以将所有的“html”页面(包括错误的“html”页面)存储在一个变量中

// 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

现在你只需使用Get方法调用页面,并使用app.get("*")捕获所有不可用的路由,以指向你的错误页面。

//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. 在app.js中添加通用错误信息代码

    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. In your function, instead of using a error-page redirect you can use set the error status first and then use next() for the code flow to go through above code -

    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()
    }
    

嗨,请找到答案

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}!`));
404页面应该在调用app.listen.Express支持路由路径中的*之前设置。这是一个匹配的特殊字符 任何东西。这可以用来创建一个匹配所有请求的路由处理程序
app.get('*', (req, res) => {
res.render('404', {
title: '404',
name: 'test',
errorMessage: 'Page not found.'
})
})

覆盖express中的所有HTTP动词

为了覆盖所有HTTP动词和所有剩余的路径,你可以使用:

app.all('*', cb)

最终的解决方案是这样的:

app.all('*', (req, res) =>{
res.status(404).json({
success: false,
data: '404'
})
})
你不应该忘记把路由器放在最后。 因为路由器的顺序很重要

上面的代码对我不起作用。

所以我找到了一个真正有效的新解决方案!

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");
});

希望这对你有所帮助!

我在定义所有路由后所做的是捕捉潜在的404并转发到错误处理程序,如下所示:

    const httpError = require('http-errors');


...


// API router
app.use('/api/', routes);
    

// catch 404 and forward to error handler
app.use((req, res, next) => {
const err = new httpError(404)
return next(err);
});


module.exports = app;

在Express中,404响应不是错误的结果,因此错误处理程序中间件不会捕获它们。你所需要做的就是在堆栈的最底部(所有其他函数的下面)添加一个中间件函数来处理404响应:

app.use(function (req, res, next) {
// YOU CAN CREATE A CUSTOM EJS FILE TO SHOW CUSTOM ERROR MESSAGE
res.status(404).render("404.ejs")
})

首先,创建一个route js文件。接下来,创建一个错误。Ejs文件(如果您正在使用Ejs)。最后,在路由文件中添加以下代码

router.get('*', function(req, res){
res.render('error');
});

这种方法更简单,但它必须是所有路线之后的最后一件事。

app.use( (req, res) => {
//render page not found
res.render('404')
})