2015-11-29 17 views
5

Quando provo a dichiarare il sotto, la pagina indice funziona, ma tutte le altre pagine sono tutte 404. So che non è un problema con il mio file links.js, poiché quando codifico l'output del ciclo for, i link tutti lavoro. I console.ha registrato l'oggetto router e mostra le informazioni nello stack. Ma quando provo ad aprire uno qualsiasi dei link, essi 404 e nulla viene registrato nella console.I percorsi in Express possono essere dichiarati con un loop?

Non è possibile dichiarare percorsi utilizzando un ciclo for? Il codice è copiato di seguito.

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; 

risposta

7

Il problema è che non si dispone di una chiusura adeguata attorno al valore corrente di links[i]. Nel momento in cui i tuoi percorsi vengono chiamati, i === links.length, quindi links[i] punta a qualcosa di diverso da quello che ti aspetti.

Il modo più semplice per aggirare questo è di usare semplicemente links.forEach() invece, che crea/utilizza una chiusura:

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()' e 'un anello for' sono diversi come ho notato nella mia risposta. Se fossero stati chiamati i gestori del percorso, vedresti la differenza nell'output. Ad ogni modo, se i gestori del percorso non vengono chiamati, dovresti (doppio) controllare i valori di '.regex'. – mscdex

Problemi correlati