Jak donutit Express.js, aby poskytoval parametry se speciálními znaky tak, jak jsou?

Snažím se dokončit jednoduchý projekt ve vzdělávacím programu freeCodeCamp „API and Microservices“.

Projekt je poměrně jednoduchý, vyžaduje práci s Express.js, některé trasy jsou poskytovány a jiné musí být dynamicky generovány. V tomto případě buď řetězec, nebo číslo, které lze analyzovat jako new Date() objekt. např.:

  • 1451001600000, toto je platný UNIXový čas v milisekundách;
  • 25.12.2016, je platné;
  • 05%20October%202011 je také platné.

Ten poslední mě zasekl a odpověď pokaždé selže. Ve skutečnosti je akceptována jako platná v objektu Date(). Výsledné datum je však chybné, protože Express.js zjevně analyzuje nebo předává parametry zbavené speciálních znaků.

Proto 05%20October%202011 bude odhlášen jako 05 October 2011 .

Podíval jsem se do dokumentace Express.js a jinde na MDN atd. Zřejmě jsem našel několik způsobů, jak to udělat pomocí query objekt, ale ne s params objekt.

Také jsem se pokusil poskytnout middleware, který by mohl problém zmírnit, ale problém vyplývá ze samotného Express API a poskytování middlewaru pro analýzu URL by nebylo užitečné, protože ne všechny požadavky jsou odesílány se speciálními znaky.

Ví někdo, jak zabránit Express.js, aby se zbavil speciálních znaků a předal parametry adresy URL tak, jak jsou?

Pamatujte, že trasy jsou náhodně kontrolovány serverem FFC, a proto není možné jednat na samotný vstup.

Děkuji mnohokrát.

Odpověď

Myslím, že úkolu nerozumíte 🙂

Vše, co zadáte do adresy URL v moderním prohlížeči, bude předáno přes encodeURIComponent . Pokud například přejdete na https://httpbin.org/get?data=one two three , prohlížeč vydá požadavek jako GET /get?data=one%20two%20three HTTP/2 (všimněte si, že prohlížeče mohou automaticky převést %20 při kontrole záhlaví požadavků můžete ve Firefoxu použít přepínač Raw na kartě Záhlaví).

Důvodem je to, že můžete odeslat text jako this/is/not/a/route nebo this&is=not&a=param jako parametry, aniž by byly analyzovány jako cesty nebo parametry dotazu.

Express to za vás pohodlně automaticky dekóduje, takže uvidíte, že req.params.data = 'one two three' . Není důvod proti tomuto chování bojovat. Nyní, pokud jste OPRAVDU chtěli získat svá procenta zpět, můžete parametr zakódovat zpět pomocí

const encoded = encodeURIComponent(req.params.data);
console.log(encoded); // 'one%20two%20three'

Pro váš příklad je pravděpodobně záměrem to, aby expresní automaticky dekódovalo 05%20October%202011 do 05 October 2011 , který pak můžete použít jako new Date(myAutomaticallyDecodedParam) .

Pokud místo toho pošlete 05%2520October%25202011 na server, bude dekódován do 05%20October%202011 . Vypadá to, že Node dostane první číslo jako den , první slovo jako měsíc a první čtyři číslice za měsícem jako rok , což pro October%202011 vede do roku 2020.

Pokud je stále něco nejasné, přidejte další kontext nebo se zeptejte 🙂