节点没有重定向到 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);
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))
对 /
的任何请求,如果之前的路由尚未处理,则将由该路由处理。
如果我转到 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);
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))
对 /
的任何请求,如果之前的路由尚未处理,则将由该路由处理。