2015-11-29 17 views
5

次のように宣言しようとすると、インデックスページは機能しますが、他のページはすべて404となります。リンクの出力をハードコードすると、links.jsファイルに問題はありません作業。私はconsole.loggedルータオブジェクトとスタックの情報を表示します。しかし、私がリンクのいずれかを開こうとすると、404になり、何もコンソールに記録されません。Expressで経路をループで宣言できますか?

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; 

答えて

7

問題は、現在の値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 }); 
    }); 
}); 
+0

'forEachの()'と 'for'ループは異なっています。ルートハンドラが呼び出された場合、出力の違いが表示されます。とにかく、あなたのルートハンドラが呼び出されないならば、 '.regex'の値を(倍)チェックするべきです。 – mscdex

関連する問題