[해결 방법] Next.js에서 _document.js의 쿠키 값 참조
6490 단어 nextjs
일본어 게시물은 here 입니다.
개요 및 참고 사항
이 문서에서는 Next.js의
_document.js
에 있는 쿠키 값을 참조하는 방법을 설명합니다.코드는 기본적으로 TypeScript로 작성되었기 때문에 파일명은 앞으로
_document.tsx
가 아닌 _document.js
로 작성될 수 있으나 두 경우 모두 동일한 파일이라고 가정합니다._document.js
에 있는 쿠키 값을 참조하고 싶은 경우는 많지 않을 수 있지만, 예를 들어 쿠키 값을 보고 <head>
태그에 있는 스크립트 로딩을 제어하고 싶은 경우가 있습니다.(예를 들어, Google Analytics를 활성화하거나 비활성화할 수 있습니다.)
우선, 염두에 두어야 할 몇 가지 사항이 있습니다.
첫째, 우리가 여기에 쓰는 방법은 해결 방법입니다.
Next.js 쪽에서 제공하는 기능이 아닌가 싶습니다.
(Next.js의 동작을 보면 미리 예상한 방법인지 구분하기 어렵습니다.)
따라서 이 방법을 사용하지 않을 수 있다면 더 좋습니다.
좀 더 직관적인 방법이 없을까 직접 찾아보고 있습니다.
다음으로 Next.js에서 제공하는
getServerSideProps
프로세스를 실행하여 이번에 달성하고자 하는 것을 달성해야 합니다.따라서 예를 들어
Nelify
에 정적 사이트로 사이트를 호스팅하는 경우 getServerSideProps
를 사용할 수 없으므로 이 접근 방식을 사용할 수 없습니다.(다른 대안이 있는지 확인하지 않았습니다.)
참고(Next.js 버전 정보)
앞서 말했듯이 이것이 Next.js가 해야 할 일인지 아닌지 확신이 서지 않으므로 Next.js 버전에 따라 동작이 변경될 수 있다는 가능성을 추가하겠습니다.
이 코드는
version "9.5.5"
로 확인됩니다.Next.js의 _document.js에 있는 쿠키 값 참조
먼저 확인을 위한 코드를 작성했습니다.
실제 동작을 보려면 이 코드를 로컬로 복제하고 실행하십시오.
Next.js sample of get cookie value at document.tsx
위의 코드는 _document.js에서 쿠키 값을 참조하는 방법을 보여줍니다.
getServerSideProps
기능을 설정합니다(예: pages/index.tsx
).getServerSideProps
는 페이지를 그릴 때 한 번만 실행하고 싶기 때문에 작성되었습니다. ctx.req.headers.cookie
에서 _document.js
의 쿠키 값 참조다음은
_document.tsx
의 쿠키 값을 실제로 참조하는 코드입니다.다음은 위의 저장소에서 가져온 코드입니다.
export default class MyDocument extends Document<Props> {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx);
let hasCookie: boolean = false;
if (ctx.req && ctx.req.headers.cookie) {
console.log('cookie values: ', ctx.req.headers.cookie);
hasCookie = true;
}
return { ...initialProps, hasCookie };
}
render() {
console.log('hasCookie: ', this.props.hasCookie);
getServerSideProps
에 _document.tsx
가 구현되어 있지 않은 것 같아서 getInitialProps
를 사용하여 쿠키 값을 한 번 얻었습니다.그러나 이 코드에 실제로 쿠키 값이 포함되어 있어도
ctx.req.headers.cookie
의 값이 반드시 포함되어 있지는 않습니다.getServerSideProps
호출은 pages/index.tsx
에서 작동하지만 이 코드를 주석 처리하면 위의 _document.tsx
에서 쿠키를 볼 수 없습니다.diff --git a/pages/index.tsx b/pages/index.tsx
index 99ea97d..23a6337 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -12,9 +12,11 @@ const IndexPage: React.FC = (): JSX.Element => (
</div>
);
+/*
export async function getServerSideProps() {
console.log('----------> Call getServerSideProps');
return { props: {} };
}
+*/
구체적으로
ctx.req
는 undefined
가 됩니다.분명히
getServerSideProps
가 작동한 후에야 값이 ctx.req
의 _document.tsx
에 저장됩니다.Next.js의 이 코드가 이런 종류의 동작에 도움이 될 수 있다고 생각합니다.
(제가 틀렸다면 죄송합니다!)
https://github.com/vercel/next.js/blob/5cab03fef0782b4ecd7dbe4ec5bd10d10554650f/packages/next/next-server/server/render.tsx#L717-L728
getServerSideProps
실행 후 값은 ctx.req
에 입력됩니다.따라서 이제 서버 측에서 한 번 실행한 후 문서 측에서 해당 값(이 경우
ctx.req
)을 참조해야 합니다.이 작업을 수행하는 더 좋은 방법을 알고 있는 사람이 있으면 의견을 말하십시오.
읽어 주셔서 감사합니다!
Reference
이 문제에 관하여([해결 방법] Next.js에서 _document.js의 쿠키 값 참조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shinshin86/workaround-reference-the-cookie-value-in-document-js-in-next-js-32am텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)