2013-08-01 9 views
7

Chciałbym użyć querystring.stringify na obiekcie. Wymagania dotyczące łańcucha są nieco nietypowe, a gwiazdki, ukośniki i apostrof muszą zostać usunięte. Querystring nie wymyka się z tego (zwykle nie musi być), ale dokumentacja mówi, że querystring.escape jest specjalnie eksponowany, dzięki czemu możemy zastąpić go naszą własną funkcją. Poniższy będzie pracować dla mnie:Przesłanianie pliku node.js querystring.escape w ramach pojedynczego modułu

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

Moim jedynym zmartwieniem jest to, że, jeśli dobrze rozumiem, to może zmienić zachowanie innych modułów, które mogą również wymagać ciągu kwerendy (z jego normalnej funkcji escape) w przyszłości. Dokumentacja node.js mówi, że moduły są ładowane tylko raz, a oryginalna instancja jest zwracana do kolejnych wywołań wymagających. Czy istnieje sposób, aby zmusić ten szczególny przypadek kwerendy do bycia wyjątkowym?

Oczywiście mogę po prostu napisać opakowanie, które zastępuje konwencjonalne wywołanie querystring.stringify, ale jestem ciekawy, ponieważ wydawało mi się dziwne, że standardowy moduł węzła naprawdę miałby ustawienie "globalne", chyba że istnieje jakiś sposób, aby wymagać wyjątkowej instancji za końcem.

+0

Dziękuję za to: https://github.com/flatiron/cradle/pull/313/files#diff-73b7aef1765d18b91942243d634fe790R10 – ceremcem

Odpowiedz

6

Czy istnieje sposób, aby zmusić ten szczególny przypadek kwerendy do unikalności?

Niezupełnie. Węzeł module caching jest w trakcie procesu i based on the module's filepath.

Zmiana nie przekroczy/od Child Processes ani Clusters. Więc możesz wyizolować swój skrypt z własnym querystring przez jeden z nich.

Jednak w tym samym procesie węzeł nie oferuje oficjalnego sposobu obejścia tego, aby pobrać unikalną instancję tylko dla pojedynczego modułu.


to może zmienić zachowanie innych modułów, które mogą również wymagać ciągu kwerendy (z jego normalnej funkcji escape) w przyszłości.

Cóż, zakodowana wartość adresu URL jest nadal ważna, jeśli ma zakodowane dodatkowe znaki. Po prostu zwykle nie muszą.

I, przypuszczam, możliwe jest wpływanie na moduły, które stawiają oczekiwania na zakodowanych wartościach. Ale zwykle jest to dziwny wybór (wyjątkiem są testy jednostkowe dla własnego querystring.escape). Tak więc, o ile można go poprawnie zdekodować, powinno być dobrze.

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 

A, zdolność do zastąpienia querystring.escape i querystring.unescape jest zgodne z projektem:

Funkcja escape używany przez querystring.stringify, warunkiem, aby mogła ona być zastąpiona w razie potrzeby.

+0

Dzięki.Miło jest wiedzieć, że prawdopodobnie nie miałoby znaczenia, czy zredefiniowałem go, by w każdym razie uciec przed większą liczbą postaci, ale sedno mojego pytania - rzeczą, którą naprawdę interesuje, niezależnie od aktualnej potrzeby - jest to, czy węzeł zapewnia mechanizm do przedefiniowania go bez zmiany wpływa na inne moduły, które również wymagają ("querystring"), na przykład przez wymuszenie unikalnej instancji querystring. Zaktualizowałem tytuł, aby uczynić to jaśniejszym. – Semicolon

+0

@Semicolon Niezupełnie. Jako [moduł podstawowy] (http://nodejs.org/api/modules.html#modules_core_modules), "querystring" będzie istniał tylko raz na proces "węzła". Ustawienie tego nie spowoduje przejścia do/z [procesów potomnych] (http://nodejs.org/api/child_process.html) ani [klastrów] (http://nodejs.org/api/cluster.html), ale poza tym nie można zmienić go tylko dla pojedynczego modułu. –

+0

Ah, cóż, ufam twojemu doświadczeniu węzłowemu. Jeśli chcesz dodać te informacje do właściwej odpowiedzi, dodam je do wiadomości. – Semicolon