2017-08-29 2 views
0

Ich habe eine sehr einfache Anwendung in Node/Express, die, sobald ein Benutzer eine Verbindung herstellt, ein http zu einem anderen Server führt, einige Berechnungen für die empfangenen Daten und reagiert auf den Benutzer.Knoten js - Sitzungsobjekt

Jetzt, da die Daten fließen Server-zu-Server und die Berechnung erforderlich sind der Flaschenhals dieses Flusses, ich möchte nicht diesen Job für jeden Benutzer wiederholen, der eine Verbindung zu meiner App herstellt.

Gibt es eine Möglichkeit, diese http-Anfrage und ihre sukzessive Berechnung nur für den ersten Benutzer durchzuführen und diese dann für jeden folgenden Benutzer wiederzuverwenden?

einige Code

var app = null; 
router.get('/ask', function(req, res, next) { 
... 
dbService.select('apps',appId).then(function(data,err, header){ 
    app = data.rows[0].doc;  

    app.a1.forEach(function(item, index){ 
     app.a1[index]['nameSpellchecker'] = new natural.Spellcheck(item.synonyms); 
    }); 

    app.a1.forEach(function(item, index){ 
     app.a2[index]['nameSpellchecker'] = new natural.Spellcheck(item.synonyms); 
    }); 

    ... 
    res.status(200).send(JSON.stringify(response)); 
}) 

im Grunde will ich halten, was ist das App-Objekt

Dank, Loris

+1

können Sie Ihren Code teilen? – ninesalt

+1

Wie viele gleichzeitige Benutzer versuchen Sie ebenfalls zu erreichen? Auf welche Art von Berechnung der Benutzer wartet, sind zeitkritische Informationen, z. B. können sich 4 gleichzeitige Benutzer mit Ihrem Server verbinden. Unter der Annahme, dass eine Warteschlange vorhanden ist Benutzer1, Benutzer2, Benutzer3, Benutzer4, erfolgt die Berechnung nur für Benutzer1 und wenn das Ergebnis der Berechnung zwischen Benutzer2, Benutzer3, Benutzer4 geteilt wird. Wird das den anderen Benutzern keine veralteten Daten geben? – Raj

+0

Let's Info sind nicht zeitsensibel, ich werde das später ansprechen ... Ich habe Somenthing hier interessant gefunden https://StackOverflow.com/Questions/19925857/Global-Scope-for-Every-Request-in-Nodejs-express Ich möchte Objs zwischen Anfragen nicht Modulen teilen ... Danke Jungs! – user2428183

Antwort

0

eine Variable in einem Umfang geteilt erstellen.

Wenn eine Verbindung besteht, testen Sie, ob die Variable einen Wert hat.

Wenn dies nicht der Fall ist, weisen Sie ihm ein Versprechen zu, das mit den gewünschten Daten aufgelöst wird.

Fügen Sie dann einen then Handler hinzu, um die Daten daraus zu erhalten und zu tun, was Sie wollen.

var processed_data; 
 

 
function get_processed_data() { 
 
    if (processed_data) { 
 
    return; // Already trying to get it 
 
    } 
 

 
    processed_data = new Promise(function(resolve, reject) { 
 
    // Replace this with the code to get the data and process it 
 
    setTimeout(function() { 
 
     resolve("This is the data"); 
 
    }, 1000); 
 
    }); 
 

 
} 
 

 
function on_connection() { 
 
    get_processed_data(); 
 

 
    processed_data.then(function(data) { 
 
    // Do stuff with data 
 
    console.log(data); 
 
    }); 
 
} 
 

 
on_connection(); 
 
on_connection(); 
 
on_connection(); 
 
setTimeout(on_connection, 3000); // A late connection to show it still works even if the promise has resolved already

Sie dann ein einziges Versprechen für jede Verbindung zum Abrufen der Daten verantwortlich, und es wird es für nachfolgende Verbindungen zwischenspeichern.