将无效请求路由到 404 错误页面
Routing an Invalid Request to a 404 Error Page
我正在尝试构建一个用户能够输入这些有效路径的服务器:
localhost:9090/admin
localhost:9090/project1
如果用户输入任何其他无效内容,例如这些,用户将被重定向到 root,然后到默认路径 localhost:9090/404.html:
我该怎么做?
这是我的代码:
app.js
var express = require('express');
var app = express();
var path = require('path');
var routes = require('c:/monex/routes/index');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static('c:/monex/admin'));
app.use('/', routes);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
var server = app.listen(9090, function () {
var host = server.address().address
var port = server.address().port
console.log("MonexJS listening at", port)
})
route.js
'use strict';
var express = require('express');
var app = express();
var router = express.Router();
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
/* GET home page. */
router.get('/', function(req, res) {
res.render('index');
});
router.get('/:projectname', function(req, res) {
var name = req.params.projectname;
res.render('c:/monex/myprojects/' + name +'/index');
});
app.use(function(req, res, next){
res.status(404).render('c:/monex/404.html', {title: "Sorry, page not found"});
});
module.exports = router;
尝试更改 404 处理函数的签名
Express 会将其用作错误处理程序,只需将更改函数参数添加到:(err, req, res, next)
Expressjs 有一种非常酷的处理错误和路由错误的方法。
1/ 确认项目是否存在
我们使用文件系统模块来确认它是否存在,使用访问 API,您可以在 https://nodejs.org/dist/latest-v6.x/docs/api/fs.html
阅读更多关于该模块的信息
var fs = require('fs') // We'll need to ask the filesystem if it exists
var projectname = 'myfolder';
// Excerpt from your code, but Modified
router.get('/:projectname', function(req, res) {
var name = req.params.projectname;
fs.access(name, fs.constants.F_OK, function(err) {
if(!err) { // directory exists
res.render('c:/monex/myprojects/' + name + '/index');
return;
}
// Directory does not exist
next({statusCode: 404});
})
});
2/ 正确路由错误
从上面的代码中,我们说任何时候目录在nodejs中不存在,调用next时带一个error对象,即next(err),next()和next(err)的区别在于expressjs中有两种中间件,第一个是:
app.use("/", function(req, res, next) {})
而第二个是
app.use("/", function(err, req, res, next) {})
两者的区别在于,第一个是路由请求的普通中间件。但第二个称为错误处理中间件。任何时候使用参数调用 next 函数时,express 跳转以从那里通过错误处理中间件路由它。所以,解决你的问题。
您将希望在应用程序级别解决此问题,以便在所有路由器上都可以传送 404 页面。
在app.js
function Error404(err, req, res, next) {
if(err.statusCode === "404") {
res.status(404).render('c:/monex/404.html', {title: "Sorry, page not found"});
}
// YOu can setup other handlers
if(err.statusCode === "504") {}
}
app.use('/', routes);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
app.use(Error404);
参考资料
http://expressjs.com/en/guide/error-handling.html
https://www.safaribooksonline.com/blog/2014/03/12/error-handling-express-js-applications/
https://github.com/expressjs/express/blob/master/examples/error-pages/index.js
我也通过将此添加到我的 app.js
来修复它
app.use(function (err, req, res, next) {
res.render('c:/monex/505.html', { status: 500, url: req.url });
})
让它看起来像这样
var express = require('express');
var app = express();
var path = require('path');
var routes = require('c:/monex/routes/index');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static('c:/monex/admin'));
app.use('/', routes);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
app.use(function (err, req, res, next) {
res.render('c:/monex/404.html', { status: 404, url: req.url });
})
var server = app.listen(9090, function () {
var host = server.address().address
var port = server.address().port
console.log("MonexJS listening at", port)
})
我正在尝试构建一个用户能够输入这些有效路径的服务器:
localhost:9090/admin
localhost:9090/project1
如果用户输入任何其他无效内容,例如这些,用户将被重定向到 root,然后到默认路径 localhost:9090/404.html:
我该怎么做?
这是我的代码:
app.js
var express = require('express');
var app = express();
var path = require('path');
var routes = require('c:/monex/routes/index');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static('c:/monex/admin'));
app.use('/', routes);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
var server = app.listen(9090, function () {
var host = server.address().address
var port = server.address().port
console.log("MonexJS listening at", port)
})
route.js
'use strict';
var express = require('express');
var app = express();
var router = express.Router();
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
/* GET home page. */
router.get('/', function(req, res) {
res.render('index');
});
router.get('/:projectname', function(req, res) {
var name = req.params.projectname;
res.render('c:/monex/myprojects/' + name +'/index');
});
app.use(function(req, res, next){
res.status(404).render('c:/monex/404.html', {title: "Sorry, page not found"});
});
module.exports = router;
尝试更改 404 处理函数的签名 Express 会将其用作错误处理程序,只需将更改函数参数添加到:(err, req, res, next)
Expressjs 有一种非常酷的处理错误和路由错误的方法。
1/ 确认项目是否存在
我们使用文件系统模块来确认它是否存在,使用访问 API,您可以在 https://nodejs.org/dist/latest-v6.x/docs/api/fs.html
var fs = require('fs') // We'll need to ask the filesystem if it exists
var projectname = 'myfolder';
// Excerpt from your code, but Modified
router.get('/:projectname', function(req, res) {
var name = req.params.projectname;
fs.access(name, fs.constants.F_OK, function(err) {
if(!err) { // directory exists
res.render('c:/monex/myprojects/' + name + '/index');
return;
}
// Directory does not exist
next({statusCode: 404});
})
});
2/ 正确路由错误 从上面的代码中,我们说任何时候目录在nodejs中不存在,调用next时带一个error对象,即next(err),next()和next(err)的区别在于expressjs中有两种中间件,第一个是:
app.use("/", function(req, res, next) {})
而第二个是
app.use("/", function(err, req, res, next) {})
两者的区别在于,第一个是路由请求的普通中间件。但第二个称为错误处理中间件。任何时候使用参数调用 next 函数时,express 跳转以从那里通过错误处理中间件路由它。所以,解决你的问题。
您将希望在应用程序级别解决此问题,以便在所有路由器上都可以传送 404 页面。
在app.js
function Error404(err, req, res, next) {
if(err.statusCode === "404") {
res.status(404).render('c:/monex/404.html', {title: "Sorry, page not found"});
}
// YOu can setup other handlers
if(err.statusCode === "504") {}
}
app.use('/', routes);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
app.use(Error404);
参考资料
http://expressjs.com/en/guide/error-handling.html
https://www.safaribooksonline.com/blog/2014/03/12/error-handling-express-js-applications/
https://github.com/expressjs/express/blob/master/examples/error-pages/index.js
我也通过将此添加到我的 app.js
来修复它app.use(function (err, req, res, next) {
res.render('c:/monex/505.html', { status: 500, url: req.url });
})
让它看起来像这样
var express = require('express');
var app = express();
var path = require('path');
var routes = require('c:/monex/routes/index');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static('c:/monex/admin'));
app.use('/', routes);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
app.use(function (err, req, res, next) {
res.render('c:/monex/404.html', { status: 404, url: req.url });
})
var server = app.listen(9090, function () {
var host = server.address().address
var port = server.address().port
console.log("MonexJS listening at", port)
})