如何在第一个匹配的路由发送响应后结束node.js执行?

时间:2015-10-30 10:07:49

标签: javascript node.js express

我使用带有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()并且它无法正常工作。我该如何解决这个问题?

2 个答案:

答案 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 /welcomeGET /error可以理解为postId=welcomepostId=error

试试这个:

router.use('/post', require('./post'));

然后事情会更清楚:

`GET /error`
`GET /posts/12345`

另一种解决方案(但不推荐)正在改变顺序:

router.use(require('./post'));
router.use(require('./error'));