# Middleware
Nuxtμμ λ―Έλ€μ¨μ΄(Middleware)λ νμ΄μ§λ λ μ΄μμμ΄ λ λλ§ λκΈ° μ μ νΈμΆλλ 컀μ€ν ν (Hook)μ λλ€. λ―Έλ€μ¨μ΄μ λνμ μΈ νΉμ§μ μλμ κ°μ΅λλ€.
- Vue μΈμ€ν΄μ€κ° μμ±λκΈ° μ μ νΈμΆλλ
asyncData
λ³΄λ€ λ μΌμ° νΈμΆλ©λλ€(Nuxt λΌμ΄ν μΈμ΄ν΄ μ°Έμ‘°). asyncData
μ λ§μ°¬κ°μ§λ‘ contextλ₯Ό μΈμλ‘ λ°κΈ° λλ¬Έμstore
,route
,params
,query
,redirect
λ±μ μ κ·Όν μ μμ΅λλ€.- μμ λ νΉμ§λ€μ νμ©νμ¬ λ€λΉκ²μ΄μ κ°λ ννλ‘ λ―Έλ€μ¨μ΄ μ μμ΄ κ°λ₯ν©λλ€.
WARNING
Nuxtμ λ λ€λ₯Έ λ―Έλ€μ¨μ΄μΈ μλ² λ―Έλ€μ¨μ΄(serverMiddleware) (opens new window)λ μ΄ νμ΄μ§μμ λ€λ£¨κ³ μμ§ μμ΅λλ€.
TIP
μλ² λ―Έλ€μ¨μ΄μ ꡬλΆνκΈ° μν΄μ ν΄λΉ νμ΄μ§μ λ€λ£¨λ λ―Έλ€μ¨μ΄λ₯Ό λΌμ°νΈ(Route) λ―Έλ€μ¨μ΄λΌκ³ λΆλ¦ λλ€.
# μ’ λ₯
λ―Έλ€μ¨μ΄λ νΉμ νμ΄μ§λ λ μ΄μμμ μ’ μλλμ§μ λ°λΌμ μ΅λͺ λ―Έλ€μ¨μ΄μ λ€μλ λ―Έλ€μ¨μ΄λ‘ λλ©λλ€.
# μ΅λͺ λ―Έλ€μ¨μ΄(Anonymous Middleware)
μ΅λͺ
λ―Έλ€μ¨μ΄λ νΉμ νμ΄μ§λ λ μ΄μμμ μ’
μλλ λ―Έλ€μ¨μ΄λ₯Ό λ»ν©λλ€. νμ΄μ§λ λ μ΄μμμμ μ§μ middleware
ν
μ ν΅ν΄ λͺ
μνκΈ° λλ¬Έμ λ€λ₯Έ νμ΄μ§λ λ μ΄μμμμ 곡μ ν μ μμ΅λλ€.
// pages/secret.vue λλ layouts/authenticated.vue
<script>
export default {
middleware({ store, redirect }) {
// λ§μ½ μ μ κ° μΈμ¦ λ°μ§ λͺ»ν κ²½μ° λ‘κ·ΈμΈ νμ΄μ§λ‘ μ΄λν©λλ€.
if (!store.state.authenticated) {
return redirect("/login");
}
},
};
</script>
# λ€μλ λ―Έλ€μ¨μ΄(Named Middleware)
λ€μλ λ―Έλ€μ¨μ΄λ μ¬λ¬ νμ΄μ§λ λ μ΄μμμμ 곡μ λ μ μλλ‘ middleware
λλ ν 리μμ νμΌλ‘ κ΄λ¦¬λλ λ―Έλ€μ¨μ΄λ€μ λ»ν©λλ€. μ΄λ¬ν λ―Έλ€μ¨μ΄λ€μ Nuxt νκ²½ νμΌμ ν΅ν΄ μ μμ μΌλ‘ μ μ©νκ±°λ λ°λλ‘ κ°κ°μ νμ΄μ§λ λ μ΄μμμ ν΅ν΄ μ λ³μ μΌλ‘ μ μ© κ°λ₯ν©λλ€.
TIP
middleware
λλ ν 리μμ κ΄λ¦¬λλ νμΌμ μ΄λ¦μ΄ λ―Έλ€μ¨μ΄μ μ΄λ¦μ΄ λκΈ° λλ¬Έμ λ€μλ λ―Έλ€μ¨μ΄λΌκ³ λΆλ¦
λλ€.
μλ μ½λλ μ μ μ€μ κ³Ό μ§μ μ€μ μ μμ μ½λμμ μ°Έμ‘°ν λ€μλ λ―Έλ€μ¨μ΄μ μμμ λλ€.
// middleware/stats.js
import http from "http";
export default function({ route }) {
return http.post("http://my-stats-api.com", {
url: route.fullPath,
});
}
# μ μ μ€μ
router.middleware
μ κ°μ μ μ©νκ³ μΆμ λ―Έλ€μ¨μ΄μ μ΄λ¦μ λ¬Έμμ΄ λλ λ¬Έμμ΄μ λ°°μ΄ ννλ‘ μ§μ νλ©΄ λͺ¨λ λΌμ°ν
μ λν΄μ ν΄λΉ λ―Έλ€μ¨μ΄κ° μλν©λλ€.
// nuxt.config.js
export default {
router: {
// λͺ¨λ λΌμ°ν
μ λν΄μ stats λ―Έλ€μ¨μ΄κ° μ μ©λ©λλ€.
middleware: "stats",
},
};
# μ§μ μ€μ
λ―Έλ€μ¨μ΄λ₯Ό μ μ©νκ³ μΆμ νμ΄μ§λ λ μ΄μμμ ν΄λΉ λ―Έλ€μ¨μ΄λ₯Ό λͺ μν©λλ€.
// pages/index.vue λλ layouts/default.vue
export default {
// μ μ μ€μ μ²λΌ middleware: "stats"λ κ°λ₯ν©λλ€.
middleware: ["stats"],
};
# νμ©λ² μμ
μλμ μμλ€μ λ€λΉκ²μ΄μ κ°λμ²λΌ μ¬μ©ν μ μλ λ―Έλ€μ¨μ΄ νμ©λ²μ λλ€.
# μΈμ¦
μΈμ¦μ λ°μ§ λͺ»ν κ²½μ° λ‘κ·ΈμΈ νμ΄μ§λ‘ 리λ€μ΄λ νΈ μν¬ μ μμ΅λλ€.
// middleware/auth.vue
export default function({ store, redirect }) {
if (!store.state.auth) {
return redirect("/login");
}
}
# λ‘μΌμΌ
μΈμ΄λ³ 컨ν μΈ λ₯Ό μ§μν κ²½μ° μ°Ύκ³ μ νλ μΈμ΄κ° μμ λ 404 νμ΄μ§λ‘ ν΄λ°±(Fallback)μ΄ μΌμ΄λ μ μμ΅λλ€. λ‘μΌμΌ λ―Έλ€μ¨μ΄λ₯Ό νμ©νλ©΄ 404 ν΄λ°±μ λ§κ³ κΈ°λ³Έ μΈμ΄ 컨ν μΈ λ‘ λ¦¬λ€μ΄λ νΈ μν¬ μ μμ΅λλ€.
// μ§μλλ λ‘μΌμΌ νλͺ©
const SUPPORTED_LOCALES = ["ko-kr", "en-us", "en-de"];
export default function({ route, redirect }) {
const { language, pageName, country } = route.params;
const locale = `${language}-${country}`;
if (SUPPORTED_LOCALES.includes(locale)) return;
// νμ¬ λ‘μΌμΌμ΄ μ§μλλ λ‘μΌμΌμ΄ μλ κ²½μ° en-usμ μ½ν
μΈ λ‘ λ¦¬λ€μ΄λ νΈ
const redirectRoute = `en/us/${pageName}`;
redirect(redirectRoute);
}
# μ°Έκ³ μλ£
β Store Nuxt Deployment β