2013-08-01 9 views
7

Ich möchte querystring.stringify für ein Objekt verwenden. Die Anforderungen für die Zeichenfolge sind leicht abweichend, wobei Sternchen, Schrägstriche und Apostrophe alle maskiert sein müssen. Querystring entgeht diesen nicht (normalerweise müssten sie nicht sein), aber die Dokumentation besagt, dass querystring.escape spezifisch angezeigt wird, so dass wir sie mit unserer eigenen Funktion überschreiben können. Die folgend würde für mich arbeiten:Überschreiben von node.js querystring.escape innerhalb eines einzelnen Moduls

querystring.escape = function(str) { 
    str = encodeURIComponent(str) 
     .replace(/\*/g, '%2A') 
     .replace(/\(/g, '%28') 
     .replace(/\)/g, '%29') 
     .replace(/'/g, '%27'); 
    return str; 
}; 

Meine einzige Sorge ist, dass, wenn ich das richtig verstehen, könnte dies das Verhalten anderer Module ändern, die auch Abfragezeichenfolgeflag erforderlich machen könnten (mit seiner normalen Escape-Funktion) in der Zukunft. Die Dokumentation von node.js besagt, dass Module nur einmal geladen werden und dass die ursprüngliche Instanz zu nachfolgenden Require-Aufrufen zurückgegeben wird. Gibt es eine Möglichkeit für mich, diese bestimmte Instanz von Querystring eindeutig zu machen?

Offensichtlich kann ich nur einen Wrapper schreiben, der den Ersatz nach einem herkömmlichen Aufruf von querystring.stringify tut, aber ich bin neugierig, weil es mir seltsam schien, dass ein Standard-Knoten-Modul wirklich eine 'globale' Einstellung hätte, es sei denn Es gibt tatsächlich einen Weg, um eine einzigartige Instanz zu erfordern.

+0

Vielen Dank dafür: https://github.com/flatiron/cradle/pull/313/files#diff-73b7aef1765d18b91942243d634fe790R10 – ceremcem

Antwort

6

Gibt es eine Möglichkeit für mich, diesen speziellen Fall zu zwingen, von Abfragezeichen einzigartig zu sein?

Nicht wirklich. Nodes module caching ist pro-Prozess und based on the module's filepath.

Eine Änderung würde nicht in/von Child Processes oder Clusters übergehen. So könnten Sie Ihr Skript mit seinem eigenen querystring durch eins von denen isolieren.

Innerhalb desselben Prozesses bietet Node jedoch keine offizielle Möglichkeit, dies zu umgehen, um eine eindeutige Instanz nur für ein einzelnes Modul abzurufen.


könnte dies das Verhalten anderer Module ändern, die auch Abfragezeichenfolgeflag erforderlich machen könnten (mit seiner normalen Escape-Funktion) in der Zukunft.

Nun, ein URL-codierter Wert ist immer noch gültig, wenn zusätzliche Zeichen codiert sind. Es ist nur so, dass sie normalerweise nicht sein müssen.

Und, ich nehme an, es ist möglich, Module zu beeinflussen, die Erwartungen auf codierte Werte setzen. Aber das ist in der Regel eine seltsame Wahl (die Ausnahme ist Unit-Tests für Ihre eigenen querystring.escape). Solange es richtig dekodiert werden kann, sollte es in Ordnung sein.

querystring.escape = function (str) { /* ... */ }; // your function here 

var sample = "a(b*c)'d"; 

var encoded = querystring.escape(sample); 
console.log(encoded);    // a%28b%2ac%29'd 

var decoded = querystring.unescape(encoded); 
console.log(decoded);    // a(b*c)'d 
console.log(decoded === sample); // true 

Und die Fähigkeit, querystring.escape und querystring.unescape ist von Entwurf, außer Kraft zu setzen:

Die Escape-Funktion von querystring.stringify, vorgesehen, so dass es bei Bedarf außer Kraft gesetzt werden könnte.

+0

Danke.Es ist schön zu wissen, dass es wahrscheinlich egal wäre, wenn ich es neu definiere, um auf jeden Fall mehr Charakteren zu entkommen, aber der Kern meiner Frage - die Sache, auf die ich wirklich neugierig bin, unabhängig von der aktuellen Notwendigkeit - ist, ob Knoten bereitstellt Ein Mechanismus, um ihn neu zu definieren, ohne dass die Änderung Auswirkungen auf andere Module hat, die ebenfalls ("querystring") erfordern, wie beispielsweise durch Erzwingen einer eindeutigen Instanz von Querystring. Ich habe den Titel aktualisiert, um das klarer zu machen. – Semicolon

+0

@Semicolon Nicht wirklich. Als ein [Kernmodul] (http://nodejs.org/api/modules.html#modules_core_modules) wird "querystring" nur einmal pro "node" -Prozess existieren. Das Setzen wird nicht in/aus [untergeordnete Prozesse] (http://nodejs.org/api/child_process.html) oder [Cluster] (http://nodejs.org/api/cluster.html) erfolgen, aber ansonsten Es ist nicht wirklich möglich, es nur für ein einzelnes Modul zu ändern. –

+0

Ah, nun, ich vertraue auf Ihre Knotenkompetenz. Wenn Sie diese Information zu der richtigen Antwort hinzufügen wollen, werde ich weitermachen und sie als akzeptiert markieren. – Semicolon

Verwandte Themen