将无效请求路由到 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)
 })