NextJS переписывает параметры строки запроса с подстановочными знаками
У меня небольшая проблема: я пытаюсь настроить перезапись в NextJS, которая автоматически отправит строку запроса в пункт назначения. Однако я могу найти только примеры с именованными параметрами. В этом случае может быть любое количество параметров, поэтому мне нужен способ создания подстановочного знака (я предполагаю, что это будет возможно?)
Я хочу сделать следующее:
/results?param1=a¶m2=b... => https://www.somedomain.com/results?param1=a¶m2=b...
or
/results?house=red&car=blue&money=none => https://www.somedomain.com/results??house=red&car=blue&money=none
rewrites() {
return [
{
source:'/results?:params*',
destination:'https://www.somedomain.com/results?:params*'
},
Конечно, это не работает, поэтому я заглянул в
has
но я не могу разобраться, как заставить его работать без параметров имен
{
source: '/some-page',
destination: '/somewhere-else',
has: [{ type: 'query', key: 'overrideMe' }],
},
3 ответа
По умолчанию перезапись будет проходить через любые параметры запроса, которые может иметь исходный URL.
В вашем случае вы можете просто использовать следующее правило перезаписи. Все параметры запроса будут перенаправлены через целевой URL.
rewrites() {
return [
{
source: '/results',
destination: 'https://www.somedomain.com/results'
}
]
}
Чтобы добиться такого поведения, вам нужно зафиксировать значение параметра запроса следующим образом:
rewrites() {
return [
{
source: "/some-page",
has: [{ type: "query", key: "override_me", value: "(?<override>.*)" }],
destination: "/somewhere-else?override_me=:override",
},
];
}
Вы можете использовать стандартную страницу, как показано ниже. Что я сделал, так это когда маршрутизатор инициализирован в
useEffect
ловушка, он получает запрос (объект), а затем использует функцию, чтобы превратить его обратно в закодированную строку URL, затем использовал
router
перенаправить на другую страницу
// /pages/some-page.jsx
import { useRouter } from 'next/router'
import { useEffect } from 'react'
const objectToQueryString = (initialObj) => {
const reducer = (obj, parentPrefix = null) => (prev, key) => {
const val = obj[key];
key = encodeURIComponent(key);
const prefix = parentPrefix ? `${parentPrefix}[${key}]` : key;
if (val == null || typeof val === 'function') {
prev.push(`${prefix}=`);
return prev;
}
if (['number', 'boolean', 'string'].includes(typeof val)) {
prev.push(`${prefix}=${encodeURIComponent(val)}`);
return prev;
}
prev.push(Object.keys(val).reduce(reducer(val, prefix), []).join('&'));
return prev;
};
return Object.keys(initialObj).reduce(reducer(initialObj), []).join('&');
};
const Results = () => {
const router = useRouter()
useEffect(() => {
const query = router.query
router.replace(`https://www.somedomain.com/results?${objectToQueryString(query)}`)
}, [router])
return <></>
}
export default Results
я использовал
objectToQueryString
на основе кодирования строки запроса объекта Javascript