可以使用循环声明Express中的路由吗?

时间:2015-11-29 19:24:04

标签: node.js express

当我尝试声明下面的内容时,索引页面有效,但其他页面都是404.我知道我的links.js文件没有问题,因为当我硬编码输出时循环,链接都工作。我console.log路由器对象,它显示堆栈中的信息。但是当我尝试打开任何链接时,它们是404,并且没有任何内容记录到控制台。

是否无法使用for循环声明路由?代码复制如下。

var express = require('express');
var router = express.Router();
var config = require('../models/config.js');
var links = require('../models/links.js');

// homepage
router.get('/', function(req, res, next) {
  res.render('index', { title: config.title });
});

for (var i = 0; i < links.length; i++) {
    router.get(links[i].regex, function(req, res, next) {
        console.log("trying to open " + links[i].url);
        res.render(links[i].url, { title: links[i].title, link: links[i] });
    });
}

module.exports = router;

1 个答案:

答案 0 :(得分:9)

问题是您没有围绕links[i]的当前值进行正确的闭包。当您的路线被调用i === links.length时,links[i]指向的内容不是您期望的内容。

最简单的方法是简单地使用links.forEach()来创建/使用闭包:

links.forEach(function(link) {
  router.get(link.regex, function(req, res, next) {
    console.log("trying to open " + link.url);
    res.render(link.url, { title: link.title, link: link });
  });
});