๐ query๋ฌธ์ value๊ฐ์ key๊ฐ๊ณผ ๋์ผํ ๊ฐ์ด ๋ค์ด๊ฐ์์ ๋
๋ณธ์ธ์ธ์ฆ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ค query์ key1=value1&key2=value2๊ฐ์ด ์ถ๊ฐ๋ ์ํ๋ก ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ๋ง์ง๋ง์ query๋ฌธ์ ๋ณ์๋ก ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ๊ฒช์๋ ์ผ์ด๋ค. ๋น์ URL์ http://localhost:3001/foo/bar?returnUrl=returnUrl=/foo&id=baz์ ๊ฐ์๋๋ฐ query๋ฌธ์ ๋ถ์ํ๋ฉด returnUrl=returnUrl=/foo๊ฐ ํ ๋ฌถ์ id=baz๊ฐ ํ ๋ฌถ์์ธ ์ด 2๊ฐ์ query๊ฐ ๋์๋ค.
๋๋ฒ์งธ query๊ฐ์ ๋ณ ์ด์์ด ์์์ผ๋, ์ฒซ๋ฒ์งธ query๊ฐ ์ด์ํ๋๋ฐ, ๋ฐ๋ก ์ฒซ๋ฒ์งธ query์ key๊ฐ์ธ returnUrl์ด value๊ฐ์๋ ๋ค์ด๊ฐ์๋ค๋ ์ ์ด์๋ค. ๋น์ value์ returnUrl=์ ํ์์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ ์ ๊ฑฐํด์ผ ํ ํ์์ฑ์ ๋๊ผ๋๋ฐ, ๋์ค์ ๋งค์ฐ ๊ฐํธํ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ์ง๋ง ์ฒ์์ ์ด๋ป๊ฒ ์ ๊ฑฐํด์ผํ ์ง ๋ชฐ๋๋ค. ๊ทธ๋์ qs ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ encoder์ ์ด์ฉํ๋ค. ์ฌ์ฉ๋ฐฉ๋ฒ์ README๋ฅผ ์ฐธ๊ณ ํ์.
stringify์ ๋๋ฒ์งธ์ธ์์ encoder ํจ์๋ฅผ ์ ์ธํ๋ฉด ์ฒซ๋ฒ์งธ ์ธ์์ query๋ฌธ์ด ๋์ด์ค๊ฒ ๋๊ณ , ๋ค๋ฒ์งธ ์ธ์์ธ type์ ์ด์ฉํด type์ด value์ผ ๋ ์กฐ๊ฑด์ ๊ฑธ์ด ์ํ๋ ์ฟผ๋ฆฌ๊ฐ์ด ๋์ด์ค๋ฉด includes๋ฅผ ํตํด split์ ํ๋๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ผ๋, ๊ฐ๋
์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๋ ์ฝ๋๊ฐ ๋์๋ค. ๊ทธ๋์ ๊ณฐ๊ณฐ์ด ์๊ฐ + ์ฝ๋๋ฆฌ๋ทฐ ๋์ ๋ ์ฌ๋ฆฐ๊ฒ์ query๋ฌธ์ ๋๊ฒจ์ค ๋ key๊ฐ์ ๋ง๋ค์ด ๋๊ธฐ๋ ๋ฐฉ๋ฒ ๋์ qs.parse๋ฅผ ์ด์ฉํ์ฌ key๊ฐ์ ๋ง๋ค์ง ์๊ณ value์ ์๋ ๊ฐ(returnUrl=/foo)์ returnUrl์ key๊ฐ์ธ ๊ฐ์ฒดํํ๋ก ๋ง๋ค์ด qs.stringify์ ๋๊ฒจ์ค ๋ spread operator๋ฅผ ์ฌ์ฉํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด์ ์ฝ๋๋ณด๋ค ๋ ๊ฐ๋
์ฑ์ด ์ข์์ง ์ฝ๋๊ฐ ๋์๋ค. qs.stringify๋ฅผ ์ฌ์ฉํ ๋ key๊ฐ์ด value์ ์ค๋ณต์ ์ธ ๋์ด์์ด ์ ๊ฑฐํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ํ์ํ๋ค๋ฉด ์ด ๊ธ์ฒ๋ผ parse + ...๋ก ํด๊ฒฐํด๋ณด์. ๋ถํ์ํ๊ฒ encoder๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ํด๊ฒฐ ํ ์ ์๋ค.
import { stringify } from 'qs'
// encoder example
var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {
if (type === 'key') {
return // Encoded key
} else if (type === 'value') {
return // Encoded value
}
}})
// before
const url = generateUrl({
path,
query: stringify(
{
returnUrl: returnUrlQuery,
ordrIdxx,
},
{
encoder: (query: string, _0, _1, type) => {
if (type === 'value') {
const value = 'returnUrl='
const isValue = query.includes(value)
if (isValue) {
const [, extractValue] = query.split(value)
return extractValue
}
}
return query
},
},
),
})
// after
import { stringify, parse } from 'qs'
const { path, query: returnUrlQuery } = parseUrl(returnUrl) // returnUrlQuery: returnUrl=/foo
const originalQuery = parse(returnUrlQuery) // { returnUrl: '/foo' }
const url = generateUrl({
path,
query: stringify({
...originalQuery,
baz,
}),
}) // url: /foo/bar?returnUrl=/foo
Reference
๋๊ธ