Next js Как получить абсолютный URL в продакшене?
Проблема, с которой я столкнулся, заключается в том, что я не могу получить абсолютный URL-адрес в производственной сборке при использовании getStaticPaths
а также getStaticProps
export async function getStaticPaths() {
const url =
process.env.NODE_ENV === "development"
? "http://localhost:3000"
: "https://websitename.vercel.app";
const res = await fetch(`${url}/api/posts`);
const posts = await res.json();
console.log("posts: ", posts);
const paths = posts.map(({ slug }) => ({
params: { slug },
}));
console.log("Paths: ", paths);
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
console.log("params: ", params);
const url =
process.env.NODE_ENV === "development"
? "http://localhost:3000"
: "https://websitename.vercel.app";
const res = await fetch(`${url}/api/post`, {
method: "POST",
body: params.slug,
});
const post = await res.json();
return {
props: { post },
};
}
Он отлично работает в сборке разработки, но когда дело доходит до производства, он не работает, потому что жестко запрограммированный https://websitename.vercel.app
не тот, который генерируется vercel
. URL-адрес, созданныйvercel
что-то вроде этого websitename-q1hdjf6c2.vercel.app
.
Как это исправить? заранее спасибо
3 ответа
К сожалению, поскольку процесс создания статического сайта выполняется без фактического запуска сайта, полный URL-адрес там недоступен. Вы можете получить доступ только к полному URL-адресу на стороне клиента в глобальномwindow
объект.
Вы также можете установить переменную среды после того, как Vercel сгенерирует URL-адрес для вашего приложения и использовать его оттуда.
Кажется, это работает
...
const router = useRouter();
...
const origin =
typeof window !== "undefined" && window.location.origin
? window.location.origin
: "";
url = origin + router.asPath;
или
import { useRouter } from "next/router";
...
const {asPath} = useRouter();
...
const url = process.env.NEXT_PUBLIC_DOMAIN + asPath;
... .env
NEXT_PUBLIC_DOMAIN='https://webaddress.com'