节点没有重定向到 Page Not found 404

Node not redirecting to Page Not found 404

如果我转到 http://localhost:4000/asdfasd,我应该会看到我的页面未找到并且我的 console.log 在服务器中,但我没有看到或。

APP.JS

const EXPRESS = require('express');
const BODY_PARSER = require('body-parser');
const PATH = require('path');

const APP = EXPRESS();

const ADMIN_ROUTES = require('./routes/admin');
const SHOP_ROUTES = require('./routes/shop');

APP.use(BODY_PARSER.urlencoded({ extended: false }));

APP.use('/admin', ADMIN_ROUTES);
APP.use(SHOP_ROUTES);

APP.use((req, res, next) => {
  console.log('page not found');
  res
    .status(404)
    .sendFile(PATH.join(__dirname, '../', 'views', 'not-found.html'));
});

APP.listen(4000);

Example code


Express 未发送 not-found.html,因为管道中更高层的东西正在处理您对 /asdfasd 的 GET 请求。

在您的情况下,APP.use(SHOP_ROUTES) 正在处理您的请求,因为所有请求(不包括以 /admin 开头的请求)都会首先发送到 SHOP_ROUTES

这里有一些案例可以说明为什么您看不到 not-found.html:


Case 1: You are using router.use() in your shop router and it is handling the request.

在这个例子中:

/routes/shop.js

router.use((req, res, next) => res.send('Something'))

/asdfasd 的请求将在页面上显示单词 "Something"。 Express 不会在管道中走得更远,因为请求已经被处理了。


Case 2: You have an asynchronous function inside your shop router that does not use next().

例如,如果您正在呼叫某些 API:

/routes/shop.js

// request-promise is an HTTP request client that returns a promise
const rp = require('request-promise')

router.use((req, res, next) => {
    rp.get('https://myapi.com/users')
        .then(response => res.json(response))
        .catch()
})

和你的API请求returns一个400+或500+的状态码,你的请求基本上卡在这个router.use()里面因为你没有告诉Express如何处理错误的请求。

您必须在 .catch():

中使用 next 函数作为回调
router.use((req, res, next) => {
    rp.get('https://myapi.com/users')
        .then(response => res.json(response))
        .catch(next)
})

Case 3: You have a dynamic route inside of your shop router, ex. /:word.

如果在您的 SHOP_ROUTES 中,您有一条动态路线,如下所示:

/routes/shop.js

router.get('/:word', (req, res, next) => res.send(req.params.word))

/ 的任何请求,如果之前的路由尚未处理,则将由该路由处理。