๐ 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
๋๊ธ