2016-09-14 2 views
0

I Routen in Express.js aus JSON-Datei erschaffe mit Struktur folgendenExpress.js Variable in dynamisch erstellten Route vorbei

{ 
    "/home":{ 
    "token":"ksdjfglkas" 
    }, 
    "/logout":{ 
    "token":"ksdjfglksaudhf" 
    } 
} 

brauche ich in der Lage sein, die Token in der Routen-Funktion zugreifen. Die js, die ich verwende, um die Route zu erzeugen ist

for(var endpoint in context){ 
    var route = context[endpoint]; 
    app.use(endpoint, 
    function(req,res,next){ 
     req.token= route.token; 
     next(); 
    }, 
    require('./route-mixin')); 
} 

Das Problem, das ich bin vor, dass routen mixin Methode immer das letzte Token erhält. context In diesem Fall ist nur die js-Datei, die ich oben hinzugefügt habe. Wie kann ich verschiedene Tokens für jede Route einzeln übergeben?

+0

Wie funktioniert Ihr route-mixin-Datei aussehen? –

+0

Funktion (req, res, nxt) {console.log (req.token); res.send ("test");} – georoot

+0

@MichaelTroger Ich habe bereits ohne Middleware getestet und es funktioniert alles gut. aber console.log zeigt immer das letzte Token – georoot

Antwort

1

Die Lösung für dieses Problem besteht darin, den Inhalt innerhalb der Schleife in einen Abschluss zu bringen.

Was mir die Idee gab, was das Problem in erster Linie ist, war die PhpStorm IDE: mutable variable is accessible from closure

Die Fehlermeldung mutable variable is accessible from closure innerhalb der ersten Middleware erschien. Dieser Artikel Mutable variable is accessible from closure. How can I fix this? gab mir dann den Tipp, einen Verschluss zu verwenden.

Also alles, was nötig war, um es ausgeführt wurde, verändert sich:

for(var endpoint in context){ 
     var route = context[endpoint]; 
     app.use(endpoint, 
      function (req, res, next) { 
       req.token = route.token; 
       next(); 
      }, 
      function (req, res) { 
       console.log(req.token); 
       res.send('test'); 
      } 
     ); 
    } 

zu:

for(var endpoint in context){ 
    (function() { 
     var route = context[endpoint]; 
     app.use(endpoint, 
      function (req, res, next) { 
       req.token = route.token; 
       next(); 
      }, 
      function (req, res) { 
       console.log(req.token); 
       res.send('test'); 
      } 
     ); 
    })(); 
} 

Der vollständige Beispielcode ich erfolgreich ausgeführt wurde:

var express = require('express'); 
var app = express(); 

var context = { 
    "/home":{ 
     "token":"ksdjfglkas" 
    }, 
    "/logout":{ 
     "token":"ksdjfglksaudhf" 
    } 
}; 
for(var endpoint in context){ 
    (function() { 
     var route = context[endpoint]; 
     app.use(endpoint, 
      function (req, res, next) { 
       req.token = route.token; 
       next(); 
      }, 
      function (req, res) { 
       console.log(req.token); 
       res.send('test'); 
      } 
     ); 
    })(); 
} 

app.listen(3000); 
Verwandte Themen