NodeJS 如何仅在缺失的路线上将Express.js连接到404?

inn6fuwd  于 2023-03-01  发布在  Node.js
关注(0)|答案(8)|浏览(120)

目前,我有以下位于我所有其他路线之下:

app.get('*', function(req, res){
  console.log('404ing');
  res.render('404');
});

而且根据日志,即使上面的路线已经匹配,它也在开火。我怎么能让它只在没有匹配的情况下开火呢?

dfddblmv

dfddblmv1#

你只需要把它放在所有路线的尽头。
请看通过路线控制的第二个示例:

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

var users = [{ name: 'tj' }];

app.all('/user/:id/:op?', function(req, res, next){
  req.user = users[req.params.id];
  if (req.user) {
    next();
  } else {
    next(new Error('cannot find user ' + req.params.id));
  }
});

app.get('/user/:id', function(req, res){
  res.send('viewing ' + req.user.name);
});

app.get('/user/:id/edit', function(req, res){
  res.send('editing ' + req.user.name);
});

app.put('/user/:id', function(req, res){
  res.send('updating ' + req.user.name);
});

app.get('*', function(req, res){
  res.send('what???', 404);
});

app.listen(3000);

或者,您可以不做任何操作,因为所有不匹配的路由都将生成404。然后,您可以使用以下代码显示正确的模板:

app.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.render('404.jade');
    } else {
        next(err);
    }
});

它记录在Error Handling中。

dsekswqp

dsekswqp2#

我敢打赌你的浏览器正在跟进一个对favicon的请求。这就是为什么你在请求页面成功200次后在日志中看到404。
设置一个图标路由。

hujrc8aj

hujrc8aj3#

你可以在所有路线的终点,

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

// All your routes and middleware here.....

app.use((req, res, next) => {
    res.status(404).json({
        message: 'Ohh you are lost, read the API documentation to find your way back home :)'
    })
})

// Init the server here,
app.listen( port, () => {
    console.log('Sever is up')
})
yzxexxkh

yzxexxkh4#

希望它有帮助,我用这个代码在底部的路线

router.use((req, res, next) => {
    next({
        status: 404,
        message: 'Not Found',
    });
});

router.use((err, req, res, next) => {
    if (err.status === 404) {
        return res.status(400).render('404');
    }

    if (err.status === 500) {
        return res.status(500).render('500');
    }

   next();
});
wbgh16ku

wbgh16ku5#

你可以用这个

const express = require('express');
const app=express();
app.set('view engine', 'pug');
app.get('/', (req,res,next)=>{
    res.render('home');
});
app.use( (req,res,next)=>{
    res.render('404');
})
app.listen(3000);
0qx6xfy6

0qx6xfy66#

我想要一个捕获所有,将呈现我的404页只在丢失的路线,并发现它在这里的错误处理文档https://expressjs.com/en/guide/error-handling.html

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(404).render('404.ejs')
})

这对我很有效。

p8ekf7hl

p8ekf7hl7#

很简单你可以添加这个中间件。

app.use(function (req, res, next) {
//Capture All 404 errors
  res.status(404).render("404.ejs")
})

服务中的404错误通常用于表示请求的资源不可用。在本文中,我们将了解如何快速处理404错误。

lx0bsm1f

lx0bsm1f8#

我们需要将错误和未找到一起处理为

为每一个编写两个单独的中间件,

// Import necessary modules
const express = require('express');

// Create a new Express app
const app = express();

// Define routes and middleware functions
app.get('/', (req, res) => {
    res.send('Hello World!');
});

// Catch 404 Not Found errors and forward to error handler
app.use((req, res, next) => {
    const error = new Error('Not Found');
    error.status = 404;
    next(error);
});

// Error handler middleware function
app.use((err, req, res, next) => {
    // Set status code and error message based on error object
    res.status(err.status || 500);
    res.send({
        error: {
            message: err.message
        }
    });
});

// Start the server
app.listen(3000, () => {
    console.log('Server started on port 3000');
});

相关问题