2017-06-09 6 views
1

Ich baue einen Client und ein serverseitiges Framework (NodeJs), in dem ich Transaktionen verfolgen möchte. Ich habe die Möglichkeit, Header (transaction_id) zwischen Client und Server übergeben, aber ich möchte in der Lage sein, die transaction_id automatisch festlegen. Das bedeutet, wenn eine Kopfzeile definiert ist, sollte eine Middleware in der Lage sein, die Transaktions-ID im Kontext zu lesen und festzulegen, so dass nachgelagerte Aufrufe sie lesen können.Wie können wir Scoping durchführen, um die Transaktionsverfolgung in NodeJs zu implementieren?

Building Wrapper ist außerhalb des Umfangs der Frage. Womit ich mich abmühen muss, ist in der Lage, einen Bereich dynamisch zu erstellen und dort Werte zu speichern.

HINWEIS - Ich verwende 'strict' Modus, der dynamische Scoping im Knoten nicht erlaubt. Brauche also einen anderen Weg. HINWEIS - Ich verwende Promises, um Client-Server-Anrufe zu tätigen.

+0

Es ist wirklich schwierig zu verstehen, was Sie hier fragen. Sie sollten die Richtlinien lesen, wie Sie gute Fragen stellen können. –

Antwort

3
hilft

Hier ist, wie ich es endlich gelöst -

I CLS verwendet, die uns erlaubt, verfolgen Sie den dynamischen Umfang.

gesamten Text Lesen durch um CLS dauerte eine Weile, so ist hier eine Zusammenfassung dessen, was ich getan habe (Laiebezeichnungen)

HINWEIS - ich bin mit NodeJS mit ‚strenge‘ Modus. Das bedeutet, dass ich das dynamische Scoping nicht verwenden kann. Angesichts seines Produktionssystems möchte ich den strikten Modus beibehalten. Daher ein alternativer Weg zum dynamischen Scoping.

1) CLS erstellt einen dynamischen Kontext/Bereich. Dadurch können Schlüssel/Wert-Paare, die nur sichtbar sind, bis wir uns innerhalb des erstellten Bereichs befinden, festgelegt/abgerufen werden.

2) Da ich die Versprechen von Bluebird verwende, hat CLS von mir verlangt, dass ich den Patch verwende, um den Kontext/Bereich innerhalb von Promises verfügbar zu halten. https://www.npmjs.com/package/cls-bluebird

3) Die Verwendung von CLS mit Promises brauchte Zeit, um herauszufinden. Hier ist eine großartige Diskussion darüber, wie verschiedene Bibliotheken CLS verwendet haben, um unterschiedliche Ergebnisse zu erzielen. https://github.com/TimBeyer/cls-bluebird/issues/6

4) Dies ist, wie ich CLS (paraphrasiert und vereinfacht) -

var cls = require('continuation-local-storage'); 
var clsbluebird = require('cls-bluebird'); 
var namespace = cls.createNamespace('ns'); 
clsbluebird(namespace); 

var result; 
namespace.run(function() { 
    namespace.set('key', 'value'); 
    result = abc(); // returns 'value' 
}); 

// versus doing – 
result = abc(); // returns undefined 

function abc() { 
    return namespace.get('key'); 
} 

5) Usecase - Auf diese Weise ich grundlegende Verfolgung der Transaktionen realisiert. Z.B. NewRelic, Trace, etc.

1

Sequelize, einer der beliebtesten orm verwendet dazu ein Modul continuation local storage

Hoffnung, die Sie aus

+0

Danke Shivam. Genau das habe ich gebraucht. – ra9z

+0

Großartig, dass es geholfen hat Kann man es markieren fragen beantwortet Also wenn jemand anderes stolpert, werden sie eine Richtung haben – Shivam

Verwandte Themen