中间件功能在使用动态路由时执行多次而不是一次

时间:2016-12-09 10:44:37

标签: javascript node.js express middleware

我有这个中间件:

app.use((req, res, next) => {
  console.log('test');
  next();
});

我有这些动态路线:

app.get('/:path', (req, res, next) =>{
  var pages = serverCache.pages;
  for (let page of pages) {
    if(req.params.path === page.path){
      res.render('foo', {
        helpers:helpers
      });
      return;
    }//if
  }//for
  res.redirect('/');
});

当加载页面时,我希望只执行一次console.log('test')。但是它被执行了很多次。实际输出是:

test
test
test
test
...

这是因为它是在for循环内的每次迭代执行的。只有当该循环中的if语句条件为真时,我该如何执行它?

2 个答案:

答案 0 :(得分:2)

我误解了什么时候会执行功能。

它被多次执行的原因是因为它为它检查的每个路由执行自己。 (之后的所有中间件函数)

为了只对我的动态路由执行,我将这两个函数都移到了底部。

app.get('static route')
app.post('static route')
app.use('static route')
app.use(); // moved it here
app.get('dynamic route')

答案 1 :(得分:1)

o(1 + count of pages verifying the condition)

验证幕后发生的事情的最简单方法是调试你的nodejs应用程序,你不能只是在下面放一些日志

app.get('/:path', (req, res, next) =>{
  console.log('Get/:path'); //NOTICE HERE
  var pages = serverCache.pages;
  for (let page of pages) {
    if(req.params.path === page.path){
      console.log('rendering foo'); //NOTICE HERE
      res.render('foo', {
        helpers:helpers
      });
      return;
    }//if
  }//for
  console.log('redirecting to /'); //NOTICE HERE
  res.redirect('/');
});