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

Javascript 如何在第一个匹配的路由发送响应后结束node.js执行?,javascript,node.js,express,Javascript,Node.js,Express,我在express中使用node.js,将所有控制器都放在一个文件夹中,使用方式如下: controllers --index.js --error.js --post.js app.js router.get('/:postId', function(req, res){...}); controllers文件夹也加载到app.js中 app.use(需要('./控制器') 在index.js inside controllers文件夹中,我有以下代码来加载所有实际的控制

我在express中使用node.js,将所有控制器都放在一个文件夹中,使用方式如下:

controllers   
--index.js  
--error.js  
--post.js  
app.js
router.get('/:postId', function(req, res){...});
controllers文件夹也加载到app.js中

app.use(需要('./控制器')

在index.js inside controllers文件夹中,我有以下代码来加载所有实际的控制器

router.use(require('./error'));
router.use(require('./post'));
在error.js中,我有这样一个结构的路由:

router.get('/error', function(req, res){...});
在post.js中,我有这样一条路线:

controllers   
--index.js  
--error.js  
--post.js  
app.js
router.get('/:postId', function(req, res){...});

现在的问题是,当我向/error发出GET请求时,它会执行error.js中的/error路由,通过
res.render()
发送响应,但之后会继续执行post.js中的/:postId路由,因为它与导致应用程序崩溃的url结构相匹配。我尝试在error.js中的
res.render()
之后添加
res.end()
,但没有成功。我怎样才能解决这个问题呢?

事实上,我认为
res.send()
可以工作,但没有。如果您将回调参数传递给
res.render(view,options,callback)
方法,它可能会工作

如下所示

res.render('error.html', {}, function(res) {
  res.end();
});
如果您愿意,可以查看express‘repo’中的response.js

如果它不起作用,还有另一个答案。

您的“错误”路由已被“发布”路由覆盖

实际上,您应该使用
'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'));

你是如何得出结论,这就是应用程序崩溃的原因?因为除非您从
/error
(我希望您不是)调用
req.next()
,否则我认为它甚至不应该传播到
/:postId
。您收到的错误消息是什么,以及/error handler的内容是什么?@laggingreflect我知道它正在运行/:通过控制台日志发布。基本上,它假设有一篇id为=“error”的文章,并试图获取它的属性,这会使它崩溃,因为我没有添加我要查找的文章不存在的情况。但是您是否在/error中调用
next()
in?这是它到达/:posted路线的唯一途径。@Jordonias不,我不打next()。这就是为什么我不知道它是如何到达/:postd的。是的,我不得不改为/post/postd以使它工作。