2017-02-12 2 views
0

Ich habe eine node.js + Express-App. Ich verwende Passport für die Benutzeranmeldung. Es gibt eine Systemeinstellungstabelle in meiner Datenbank, die ich auslesen möchte, wenn sich ein Benutzer erfolgreich anmeldet und dann lokale app.locals.setting_name-Variablen daraus erstellt, die während der Lebensdauer der Anwendung verwendet werden.Node.js Express-App einfügen app.local.setting nur einmal beim Einloggen

Die Einstellungstabelle enthält die Spalten Name und Wert, die den Einstellungsnamen und den entsprechenden Wert darstellen. So etwas wie: Name - SUPPORT_EMAIL und Value - [email protected], als ein Beispiel.

So würde ich app.locals.SUPPORT_EMAIL Wert gesetzt als [email protected]

Hier ist der Code Ich habe bisher:

app.js

var settingsObj = require('./config/appSettings.js'); 
app.use(function(req, res, next) { 
    ... 
    ... 
    settingsObj.getApplicationSystemSetting(req.user, app); 
    next(); 
}); 

appSettings.js

exports.getApplicationSystemSetting = function() { 
    connectionPool.getConnection(function(err, connection){ 
     connection.query('select Name, Value from SystemSettings', function(err, rows){ 
      if(err) { 
       winston.log('info', '--------------------- ERROR: ' + err); 
       return; 
      } 

      console.log('-------------- settings: ' + JSON.stringify(rows)); 
      for(var i = 0; i < rows.length; i++) { 
       var setting = rows[i]; 
       app.locals.setting.Name = setting.Value; 
      } 
     }); 
    }); 
} 

Es gibt jedoch zwei Probleme, denen ich gegenüberstehe:

1) Die app.use ruft den Einstellungscode jedes Mal auf, wenn ich auf eine neue Seite gehe. Ich möchte nur, dass dieser Code nur einmal aufgerufen wird, wenn der Benutzer sich anmeldet.

2) Die app.locals sind nicht festgelegt. Wenn ich eine Debug-App mache. Locals.SUPPORT_EMAIL als undefiniert.

Irgendwelche Vorschläge oder Ideen, wie dies verbessert werden kann?

Antwort

0

Also, zwei Dinge. app.use wird tatsächlich bei jeder Anfrage passieren. Der einfachste Weg, um mit Ihrem Bedarf fertig zu werden, besteht darin, diese Middleware-Prüfung für app.user durchzuführen. Wenn sie nicht da ist, rufen Sie next() auf, ohne etwas anderes zu tun. Die Middleware wird also aufgerufen, versucht aber nicht, Locals zu setzen.

Zweite Ausgabe, Ihre Funktion, die app.locals setzt nicht wirklich die Parameter verwenden Sie sie vorbei sind (man beachte die Funktion Signatur in Ihrem zweiten Codeblock), und es async ist, so gibt es eine gute Chance, dass die Middleware next() aufruft, bevor sie überhaupt ausgeführt wird. Ändern Sie die Funktion Signatur:

Funktion (Benutzer, Einheimische, Rückruf)

und haben dann die Middleware-Pass ‚next‘ als Rückruf. Das lokale Objekt, das Sie übergeben, sollte res.locals sein, da Sie nur die Variable für diese Antwort festlegen möchten, nicht die gesamte App.

+0

danke für die Lösung. Ich werde App.locals.SETTING_NAME verwenden, da diese Einstellungen während der Laufzeit der App verwendet werden. Eine andere Sache, die ich fragen wollte, war, gibt es eine Grenze für die Anzahl der app.locals, die wir tun können? Ursache Einige der Zeilen, die ich in lokalen Speichern speichern möchte, werden als nicht definiert angezeigt. Auch wenn ich sie wie app.locals.mysetting = 'hallo' und später console.log (app.locals.mysetting) fest codiere; es kommt wie undefiniert. Irgendeine Idee? – codeinprogress