feat: improve structure and error handling

This commit is contained in:
Michael Zetterberg
2024-05-14 15:55:46 +02:00
parent 01587d7fd5
commit f5108d1a8e
104 changed files with 1505 additions and 1570 deletions

View File

@@ -1,16 +1,30 @@
import { NextMiddleware } from "next/server"
import { NextMiddleware, NextResponse } from "next/server"
import { findLang } from "./constants/languages"
import * as authRequired from "./middlewares/authRequired"
import * as cmsContent from "./middlewares/cmsContent"
import * as currentWebLogin from "./middlewares/currentWebLogin"
import * as ensureLang from "./middlewares/ensureLang"
import * as handleAuth from "./middlewares/handleAuth"
import * as myPages from "./middlewares/myPages"
import * as webView from "./middlewares/webView"
export const middleware: NextMiddleware = async (request, event) => {
const lang = findLang(request.nextUrl.pathname)
if (!lang) {
// Lang is required for all our middleware.
// Without it we shortcircuit early.
// We use middleware-error route because notFound() requires a root layout
// which we do not want. We can move to that once all Current stuff is gone.
return NextResponse.rewrite(
new URL(`/${lang}/middleware-error/404`, request.nextUrl),
{
status: 404,
statusText: "Not found",
}
)
}
const middlewares = [
ensureLang,
currentWebLogin,
authRequired,
handleAuth,
@@ -19,13 +33,48 @@ export const middleware: NextMiddleware = async (request, event) => {
cmsContent,
]
for (let i = 0; i < middlewares.length; ++i) {
const middleware = middlewares[i]
try {
for (let i = 0; i < middlewares.length; ++i) {
const middleware = middlewares[i]
if (middleware.matcher(request)) {
return await middleware.middleware(request, event)
if (middleware.matcher(request)) {
const result = await middleware.middleware(request, event)
const _continue = result?.headers.get("x-continue")
if (_continue) {
continue
}
// We use x-lang as either Akamai or Netlify use x-language as the users preferred language
result?.headers.set("x-lang", lang)
result?.headers.set("x-pathname", request.nextUrl.pathname)
result?.headers.set("x-url", request.nextUrl.href)
return result
}
}
} catch (e) {
if (e instanceof NextResponse && e.status) {
return NextResponse.rewrite(
new URL(`/${lang}/middleware-error/${e.status}`, request.nextUrl),
{
status: e.status,
statusText: e.statusText,
}
)
}
console.error(`Error in middleware`)
console.error(e)
return NextResponse.rewrite(
new URL(`/${lang}/middleware-error/500`, request.nextUrl),
{
status: 500,
statusText: "Internal Server Error",
}
)
}
// Follow through with normal App router rules.
return NextResponse.next()
}
// See "Matching Paths" below to learn more