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

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

使用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; 

问题是,你没有正确的closureslinks[i]的当前价值links[i] 。 当你的路线被调用的时候, i === links.length ,所以links[i]指向的东西不是你期望的。

最简单的方法就是简单地使用links.forEach()代替创build/使用闭包:

 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 }); }); });