旧版本节点中数据库的动态路由

时间:2016-11-18 17:00:00

标签: javascript express

我正在使用Node.js v~4。

我正在尝试使用数据库中的对象来构建路由。这是我的逻辑:

  for (page of pages) {
    app.get(`/${page.path}`, (req, res)=> {
      res.render('test', {
        page:page,
      })
    })
  }

但是,无论我访问哪个URL,我总是从数据库中的最后一个对象获取内容。

所以网址有效,但app.get()回调函数内的代码无法正常工作。例如,page变量无效,显示最后一个对象,而不是一个匹配路径。如果我要添加此代码:

console.log(req.url);
console.log(page.path);

作为回调函数内的第一行,我会得到下一个输出:

点击第一个网址:

/test01
test03

点击第二个网址:

/test02
test03

动态路由和页面是否有更方便的方法?

2 个答案:

答案 0 :(得分:1)

你需要在迭代的变量上使用let来保留范围 - 否则它总是将路由绑定到迭代的最后一个项目: < / p>

由于节点不支持let,因此请使用IIFE:

for (page of pages) {
    (function(p) {
        app.get(`/${p.path}`, (req, res)=> {
            res.render('test', {
                page:p,
            })
        })
    })(page)
}

答案 1 :(得分:1)

这对我有用:

router.get('/:page', function (req, res) {
    var page = req.params.page;
    if (pages.indexOf(page) === -1) res.redirect('/');
    else res.render('index', {title: page});
});