使用Express 4处理404错误

15

我正在使用Express 4,有大约50个HTML页面。我试图处理404错误,但是无法弄清楚如何处理。我不想在node中手动定义所有路由器。是否有一种方法可以动态重定向到404 Jade模板,如果页面不存在?

我尝试了这段代码,但没有成功:

app.enable('verbose errors');
app.set('port', 3000);

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

var server = http.createServer(app);
server.listen(app.get('port'), function() {
    console.log('ONLINE !');
});

app.use(function(req, res, next) {
    console.log('GET ' + req.originalUrl)
    console.log('At %d', Date.now());
    next();
});

// Handle 404
app.use(function(req, res, next) {
    if(req.accepts('html') && res.status(404)) {
        res.render('404.jade');
        return;
    }
});

动态地如何实现?你需要以某种方式定义路由,可以使用路由器、app.useapp.error或中间件等。你的所有文件都是静态的吗?除了静态路由之外,你似乎没有其他路由,并且所有动态请求都会进入404处理程序? - adeneo
是的,它们都是静态的。我有一些 GET 和 POST 请求,但那是我在构建 API 时使用的。如果我设置一个中间件,所有请求最终都会出现 404 错误。 - AlexisP
1
所以即使是静态的也会最终进入404路由?你应该在定义路由后再进行“监听”,因此将该行移至底部。 - adeneo
如@adeneo所说,请按照我的答案顺序进行操作。这对我很有效。谢谢。 - shanmugharaj
不幸的是,那对我没用。Post和Get请求都没问题,只有静态文件会像@shansfk一样进入404路由。 - AlexisP
请检查更新后的答案。 - shanmugharaj
3个回答

29

这对我起作用:

var express = require('express');
var app = express();

app.use(express.static('public'));

app.get('/', function (req, res) {
    res.send('Hello World!');
});

app.get('/employee', function (req, res) {
    res.send('Employee route !!');
});


// Handle 404 - Keep this as a last route
app.use(function(req, res, next) {
    res.status(404);
    res.send('404: File Not Found');
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

文件夹结构,

enter image description here

现在当我们像这样发出请求

http://localhost:3000/sample

这已经被中间件处理了。

更新

不用编写获取请求(get request)就可以显示HTML文件的方法只需要另一个中间件就行了,如下:

app.use(express.static('public'));
app.use(express.static('views'));
将“视图”中间件添加到“公共”之后。
现在,如果我们提供

http://localhost:3000/index.html

页面将呈现。

问题在于我有50个HTML页面,我不想为它们创建GET请求。除非我必须这样做。 - AlexisP
请检查一下。这样可以吗?如果我误解了您,我很抱歉。对不起! - shanmugharaj
我很高兴它对你有帮助。:) - shanmugharaj
它起作用了。但为什么状态码是400?应该是404吧? - Krishnadas PC
当我将这个作为最后一个路由时,我得到了错误[ERR_HTTP_HEADERS_SENT]:无法在向客户端发送头之后设置头。 - Arthur Mastropietro

1
如果您只想重定向,那么可以简单地使用以下内容:
app.use((req, res) => {
    res.status(404).redirect('/MyHomepage')
});


0
非常简单,您可以添加此中间件。
app.use(function (req, res, next) {
  res.status(404).send("Sorry can't find that!")
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接