JS ถัดไป - การจัดการ getInitialProps บน _app.js ใน SSR เทียบกับ CSR

ฉันกำลังพยายามสร้างแอปพลิเคชัน Next JS ที่จัดการการรับรองความถูกต้องและการกำหนดเส้นทางเริ่มต้นภายใน getInitialProps ฉันค้นพบวิธีการนี้สามารถดำเนินการได้ทั้งในเซิร์ฟเวอร์หรือบนไคลเอนต์ แนวทางของฉันจนถึงตอนนี้คือการมีตัวจัดการ 2 ตัวที่แตกต่างกันโดยขึ้นอยู่กับการตรวจจับว่าฉันกำลังดำเนินการในเซิร์ฟเวอร์หรือไม่ โดยตรวจสอบว่ามีแอตทริบิวต์ req ภายใน ctx หรือไม่ นี่เป็นการหลอกลวง แต่ไม่รู้สึกว่าเป็นวิธีที่ถูกต้อง ใครช่วยบอกฉันทีว่ามีวิธีที่สะอาดกว่านี้หรือไม่ การรับรองความถูกต้องทั้งหมดได้รับการจัดการในโดเมนย่อยแยกต่างหาก ดังนั้นฉันเพียงแค่ต้องเปลี่ยนเส้นทางไปยังโดเมนย่อยการรับรองความถูกต้อง หากไม่มีคุกกี้หรือคำขอการรับรองความถูกต้องล้มเหลวด้วยเหตุผลอื่นบางประการ

import "../../styles/globals.css";

function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

MyApp.getInitialProps = async (appContext) => {
    let cookie, user;

    let ctx = appContext.ctx;

    //Check if I am in the server.
    if (ctx.req) {
        cookie = ctx.req.headers.cookie
        //Do auth request.

        //Redirect base on user properties
        // handle redirects using res object
        ctx.res.writeHead(302, { Location: "/crear-cuenta"});
         
    }  else {
        cookie = window.document.cookie;
        //Do auth request.
        //Redirect base on user properties
        //Do redirects using client side methods (useRouter hook, location.replace)???
    }

    //Return pageProps to the page with the authenticted user information.
    return { pageProps: { user: user } };
  
};

export default MyApp;

person aolivera    schedule 10.08.2020    source แหล่งที่มา


คำตอบ (1)


ฉันคิดว่ารหัสของคุณสะอาดเพียงพอ แน่นอนคุณยังคงสามารถรักษามันไว้ได้

ข้อเสนอแนะของฉันจะเป็นดังนี้:

MyApp.getInitialProps = async (appContext) => {

ในบรรทัดนี้ คุณสามารถใช้เทคนิคการทำลายวัตถุเพื่อให้บริบทตรงไปตรงมา:

MyApp.getInitialProps = async ({ ctx }) => {

ดังนั้นคุณจะไม่ต้องใช้บรรทัดนี้อีกต่อไป : let ctx = appContext.ctx;

ส่วนที่สำคัญที่สุดของโค้ดของคุณซึ่งสามารถล้างข้อมูลได้คือพื้นที่ที่คุณเขียนคำขอการรับรองความถูกต้องสองครั้งในเงื่อนไข if/else ฉันขอแนะนำให้คุณใช้ส่วนนั้นดังนี้:

const cookie = ctx.req ? ctx.req.headers.cookie : window.document.cookie;

แม้ว่าฉันจะพยายามเก็บทุกอย่างไว้ใน getInitialProps บนฝั่งเซิร์ฟเวอร์ ในกรณีนี้ ฉันจะทำการเปลี่ยนแปลงเล็กน้อยเพื่อรับคุกกี้ดังต่อไปนี้และประมวลผลในฝั่งเซิร์ฟเวอร์เท่านั้น

const cookie = cookie.parse(ctx.req ? ctx.req.headers.cookie || "" : undefined);

โปรดทราบว่า: ฉันใช้ตัวแยกวิเคราะห์คุกกี้ซึ่งคุณสามารถติดตั้งแพ็คเกจด้วยตัวเองได้เช่นกัน (npm install cookie)

หากคุณต้องการตรวจสอบคุกกี้ของคุณเพิ่มเติมที่ฝั่งไคลเอ็นต์ ฉันจะตรวจสอบใน componentdidmount หรือในกรณีที่คุณใช้ react hooks ใน useEffect แต่มันไม่จำเป็น

ตอนนี้คุณสามารถใช้ //Do auth request เพียงครั้งเดียว ซึ่งจะทำให้โค้ดสะอาดขึ้นและลดการทำซ้ำโดยไม่จำเป็น

person Hooman    schedule 11.08.2020