我使用带有express的node.js并将所有控制器放在一个文件夹中,并按照以下方式使用:
controllers
--index.js
--error.js
--post.js
app.js
控制器文件夹在app.js中加载,如此
app.use(require('./controllers'));
在controller.js内部控制器文件夹中,我有以下代码来加载所有实际的控制器
router.use(require('./error'));
router.use(require('./post'));
在error.js中我有这种结构的路线:
router.get('/error', function(req, res){...});
在post.js中我有这样的路线:
router.get('/:postId', function(req, res){...});
现在的问题是当我向 / error 发出GET请求时,它会在error.js中执行/ error路由,它会通过res.render()
发送响应,但之后继续在post.js中执行/:postId路由,因为它匹配使应用程序崩溃的url结构。我在error.js中尝试在res.end()
之后添加res.render()
并且它无法正常工作。我该如何解决这个问题?
答案 0 :(得分:0)
实际上我认为res.send()
可行,但事实并非如此。也许如果你将一个回调参数传递给res.render(view, options, callback)
方法,它可以工作。
如下所示;
res.render('error.html', {}, function(res) {
res.end();
});
如果您愿意,可以在快递'repo中的response.js上查看render method。
如果它不起作用,还有另一个答案here。
答案 1 :(得分:0)
您的“错误”路线已被“邮寄”路线覆盖。
实际上您应该使用'posts/:postId'
代替'/:postId'
,因为它可能会对未来产生混淆。
例如:GET /welcome
或GET /error
可以理解为postId=welcome
或postId=error
试试这个:
router.use('/post', require('./post'));
然后事情会更清楚:
`GET /error`
`GET /posts/12345`
另一种解决方案(但不推荐)正在改变顺序:
router.use(require('./post'));
router.use(require('./error'));