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 🙂