在找到一个之后快速匹配其他路线

时间:2016-01-19 18:44:00

标签: node.js express

我正在使用Express 4.13.3和Mongoose 4.2.4构建一个简单的博客,我遇到的问题是,在路由匹配后,后续路由也会匹配,导致应用程序崩溃。

路线安装在 app.js 文件中,如下所示:

// Load blog routes.
var blogRoutes      = require('./app/routes/blog');

// Mount routes.
app.use(blogRoutes);

./ app / routes / blog 文件的内容:

var express         = require('express');
var router          = express.Router();
var blogCtrl        = require('../controllers/blog');

// Home
router.get('/', blogCtrl.list);

// Static pages.
router.get('/about', blogCtrl.about);

// Blog posts.
router.get('/:postUrl', blogCtrl.detail);

../ controllers / blog 文件的内容:

module.exports.list = function (req, res) {      
    Post.find(function (err, posts) {
        res.render('index', { 
            title: 'Home page',
            posts: posts
        });   
    });
}

module.exports.detail = function (req, res) {
    Post.findOne({ 'url': req.params.postUrl }, function (err, post) {
        res.render('post', { 
            title: post.title,
            post: post
        });
    });
}

module.exports.about = function (req, res) {
    res.render('about', { title: 'About' });
}

当我请求root(/)或about(/ about)页面时,它会正确呈现。但是我的问题是博客帖子路径(/:postUrl)继续匹配,并且由于没有传递网址段,因此在将“post.title”分配给“标题”键时应用程序崩溃。

不可否认,我没有添加任何中间件来捕获错误,但我不明白为什么在路由匹配后,后续路由也试图加载,即使没有调用'next()'来传递请求。

我知道'/ about'会匹配路径'/:postUrl',但因为之前定义了'about'路由,它不应该只是匹配并结束请求周期吗?

2 个答案:

答案 0 :(得分:0)

我认为你不能这样做,你必须在“/:postURl”中测试如果param是空的,如果是,则渲染列表。 Express无法知道它是/或/:带有null参数的postURl。

表达,与正则表达式匹配所有路线,这就是为什么/:postURl被解雇

答案 1 :(得分:0)

我弄清楚它是什么。基本上是因为我为各个博客帖子( /:postUrl )定义路线的方式,当浏览器请求favicon(他们可以通过查看根目录自动执行)时,我的路线正在匹配

这解释了为什么在浏览器请求favicon(' /favicon.ico ')之前呈现正确的路线然后会崩溃。

为了解决这个问题,我做了两件事:

  1. 我已将serve-favicon中间件添加到 app.js 文件中以处理“ /favicon.ico ”的请求,并将请求路由到我的'公开'文件夹。
  2. 我已将错误捕获添加到我的博客详细信息路由中,这样如果找不到帖子,它会将错误转发到错误处理中间件上以便正确处理。
相关问题