我正在使用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'路由,它不应该只是匹配并结束请求周期吗?
答案 0 :(得分:0)
我认为你不能这样做,你必须在“/:postURl”中测试如果param是空的,如果是,则渲染列表。 Express无法知道它是/或/:带有null参数的postURl。
表达,与正则表达式匹配所有路线,这就是为什么/:postURl被解雇
答案 1 :(得分:0)
我弄清楚它是什么。基本上是因为我为各个博客帖子( /:postUrl )定义路线的方式,当浏览器请求favicon(他们可以通过查看根目录自动执行)时,我的路线正在匹配
这解释了为什么在浏览器请求favicon(' /favicon.ico ')之前呈现正确的路线然后会崩溃。
为了解决这个问题,我做了两件事: