[{"data":1,"prerenderedAt":950},["ShallowReactive",2],{"navigation":3,"-guide-basics-middleware":184,"-guide-basics-middleware-surround":945},[4,91,133,161,168],{"title":5,"path":6,"stem":7,"children":8,"icon":90},"Guide","/guide","1.guide/0.index",[9,12,53,69],{"title":10,"path":6,"stem":7,"icon":11},"Getting Started","pixel:play",{"title":5,"icon":13,"path":14,"stem":15,"children":16,"page":52},"ph:book-open-duotone","/guide/basics","1.guide/1.basics",[17,22,27,32,37,42,47],{"title":18,"path":19,"stem":20,"icon":21},"Request Lifecycle","/guide/basics/lifecycle","1.guide/1.basics/1.lifecycle","icon-park-outline:handle-round",{"title":23,"path":24,"stem":25,"icon":26},"Routing","/guide/basics/routing","1.guide/1.basics/2.routing","solar:routing-bold",{"title":28,"path":29,"stem":30,"icon":31},"Middleware","/guide/basics/middleware","1.guide/1.basics/3.middleware","mdi:middleware-outline",{"title":33,"path":34,"stem":35,"icon":36},"Event Handlers","/guide/basics/handler","1.guide/1.basics/4.handler","mdi:function",{"title":38,"path":39,"stem":40,"icon":41},"Sending Response","/guide/basics/response","1.guide/1.basics/5.response","tabler:json",{"title":43,"path":44,"stem":45,"icon":46},"Error Handling","/guide/basics/error","1.guide/1.basics/6.error","tabler:error-404",{"title":48,"path":49,"stem":50,"icon":51},"Nested Apps","/guide/basics/nested-apps","1.guide/1.basics/7.nested-apps","material-symbols-light:layers-outline",false,{"title":54,"icon":55,"path":56,"stem":57,"children":58,"page":52},"API","material-symbols-light:api-rounded","/guide/api","1.guide/900.api",[59,64],{"title":60,"path":61,"stem":62,"icon":63},"H3","/guide/api/h3","1.guide/900.api/1.h3","material-symbols:bolt-rounded",{"title":65,"path":66,"stem":67,"icon":68},"H3Event","/guide/api/h3event","1.guide/900.api/2.h3event","material-symbols:data-object-rounded",{"title":70,"icon":71,"path":72,"stem":73,"children":74,"page":52},"Advanced","hugeicons:more-01","/guide/advanced","1.guide/901.advanced",[75,80,85],{"title":76,"path":77,"stem":78,"icon":79},"Plugins","/guide/advanced/plugins","1.guide/901.advanced/1.plugins","clarity:plugin-line",{"title":81,"path":82,"stem":83,"icon":84},"WebSockets","/guide/advanced/websocket","1.guide/901.advanced/2.websocket","hugeicons:live-streaming-02",{"title":86,"path":87,"stem":88,"icon":89},"Nightly Builds","/guide/advanced/nightly","1.guide/901.advanced/9.nightly","game-icons:barn-owl","i-ph:book-open-duotone",{"title":92,"path":93,"stem":94,"children":95,"icon":97},"Utils","/utils","2.utils/0.index",[96,98,103,108,113,118,123,128],{"title":92,"path":93,"stem":94,"icon":97},"ph:function-bold",{"title":99,"path":100,"stem":101,"icon":102},"Request","/utils/request","2.utils/1.request","material-symbols-light:input",{"title":104,"path":105,"stem":106,"icon":107},"Response","/utils/response","2.utils/2.response","material-symbols-light:output",{"title":109,"path":110,"stem":111,"icon":112},"Cookie","/utils/cookie","2.utils/3.cookie","material-symbols:cookie-outline",{"title":114,"path":115,"stem":116,"icon":117},"Security","/utils/security","2.utils/4.security","wpf:key-security",{"title":119,"path":120,"stem":121,"icon":122},"Proxy","/utils/proxy","2.utils/5.proxy","arcticons:super-proxy",{"title":124,"path":125,"stem":126,"icon":127},"More utils","/utils/more","2.utils/9.more","mingcute:plus-line",{"title":129,"path":130,"stem":131,"icon":132},"Community","/utils/community","2.utils/99.community","lets-icons:external",{"title":134,"path":135,"stem":136,"children":137,"icon":139},"Examples","/examples","4.examples/0.index",[138,140,145,149,153,157],{"title":134,"path":135,"stem":136,"icon":139},"ph:code",{"title":141,"path":142,"stem":143,"icon":144},"Cookies","/examples/handle-cookie","4.examples/handle-cookie","ph:arrow-right",{"title":146,"path":147,"stem":148,"icon":144},"Sessions","/examples/handle-session","4.examples/handle-session",{"title":150,"path":151,"stem":152,"icon":144},"Static Assets","/examples/serve-static-assets","4.examples/serve-static-assets",{"title":154,"path":155,"stem":156,"icon":144},"Stream Response","/examples/stream-response","4.examples/stream-response",{"title":158,"path":159,"stem":160,"icon":144},"Validate Data","/examples/validate-data","4.examples/validate-data",{"title":162,"path":163,"stem":164,"children":165,"icon":167},"Migration","/migration","5.migration/0.index",[166],{"title":162,"path":163,"stem":164,"icon":167},"icons8:up-round",{"title":169,"path":170,"stem":171,"children":172},"Blog","/blog","99.blog",[173,176,180],{"title":169,"path":170,"stem":174,"icon":175},"99.blog/index","i-lucide-file-text",{"title":177,"path":178,"stem":179,"icon":175},"H3 1.8 - Towards the Edge of the Web","/blog/v1.8","99.blog/1.v1.8",{"title":181,"path":182,"stem":183,"icon":175},"H3 v2 beta","/blog/v2-beta","99.blog/2.v2-beta",{"id":185,"title":28,"body":186,"description":939,"extension":940,"meta":941,"navigation":942,"path":29,"seo":943,"stem":30,"__hash__":944},"content/1.guide/1.basics/3.middleware.md",{"type":187,"value":188,"toc":937,"icon":31},"minimark",[189,196,199,203,219,226,283,288,387,393,462,468,530,543,546,640,654,933],[190,191,192],"important",{},[193,194,195],"p",{},"\nWe recommend using composable utilities whenever possible. Global middleware can complicate application logic, making it less predictable and harder to understand.",[193,197,198],{},"Global middleware run on each request before route handler and act as wrappers to intercept request, response and errors.",[200,201],"read-more",{"title":18,"to":202},"/guide/basics/lifecycle#\\_3-dispatch-request",[193,204,205,206,210,211,218],{},"You can register global middleware to ",[207,208,209],"a",{"href":61},"app instance"," using the ",[207,212,214],{"href":213},"/guide/api/h3#h3use",[215,216,217],"code",{},"H3.use",".",[193,220,221,225],{},[222,223,224],"strong",{},"Example:"," Register a global middleware that logs every request.",[227,228,233],"pre",{"className":229,"code":230,"language":231,"meta":232,"style":232},"language-js shiki shiki-themes github-light github-dark github-dark","app.use((event) => {\n  console.log(event);\n});\n","js","",[215,234,235,265,277],{"__ignoreMap":232},[236,237,240,244,248,251,255,258,262],"span",{"class":238,"line":239},"line",1,[236,241,243],{"class":242},"slsVL","app.",[236,245,247],{"class":246},"shcOC","use",[236,249,250],{"class":242},"((",[236,252,254],{"class":253},"sQHwn","event",[236,256,257],{"class":242},") ",[236,259,261],{"class":260},"so5gQ","=>",[236,263,264],{"class":242}," {\n",[236,266,268,271,274],{"class":238,"line":267},2,[236,269,270],{"class":242},"  console.",[236,272,273],{"class":246},"log",[236,275,276],{"class":242},"(event);\n",[236,278,280],{"class":238,"line":279},3,[236,281,282],{"class":242},"});\n",[193,284,285,287],{},[222,286,224],{}," Register a global middleware that matches certain requests.",[227,289,291],{"className":229,"code":290,"language":231,"meta":232,"style":232},"app.use(\n  \"/blog/**\",\n  (event, next) => {\n    console.log(\"[alert] POST request on /blog paths!\");\n  },\n  {\n    method: \"POST\",\n    // match: (event) => event.req.method === \"POST\",\n  },\n);\n",[215,292,293,302,311,330,347,353,359,370,377,382],{"__ignoreMap":232},[236,294,295,297,299],{"class":238,"line":239},[236,296,243],{"class":242},[236,298,247],{"class":246},[236,300,301],{"class":242},"(\n",[236,303,304,308],{"class":238,"line":267},[236,305,307],{"class":306},"sfrk1","  \"/blog/**\"",[236,309,310],{"class":242},",\n",[236,312,313,316,318,321,324,326,328],{"class":238,"line":279},[236,314,315],{"class":242},"  (",[236,317,254],{"class":253},[236,319,320],{"class":242},", ",[236,322,323],{"class":253},"next",[236,325,257],{"class":242},[236,327,261],{"class":260},[236,329,264],{"class":242},[236,331,333,336,338,341,344],{"class":238,"line":332},4,[236,334,335],{"class":242},"    console.",[236,337,273],{"class":246},[236,339,340],{"class":242},"(",[236,342,343],{"class":306},"\"[alert] POST request on /blog paths!\"",[236,345,346],{"class":242},");\n",[236,348,350],{"class":238,"line":349},5,[236,351,352],{"class":242},"  },\n",[236,354,356],{"class":238,"line":355},6,[236,357,358],{"class":242},"  {\n",[236,360,362,365,368],{"class":238,"line":361},7,[236,363,364],{"class":242},"    method: ",[236,366,367],{"class":306},"\"POST\"",[236,369,310],{"class":242},[236,371,373],{"class":238,"line":372},8,[236,374,376],{"class":375},"sCsY4","    // match: (event) => event.req.method === \"POST\",\n",[236,378,380],{"class":238,"line":379},9,[236,381,352],{"class":242},[236,383,385],{"class":238,"line":384},10,[236,386,346],{"class":242},[193,388,389,390,392],{},"You can register middleware with ",[215,391,323],{}," argument to intercept return values of next middleware and handler.",[227,394,396],{"className":229,"code":395,"language":231,"meta":232,"style":232},"app.use(async (event, next) => {\n  const rawBody = await next();\n  // [intercept response]\n  return rawBody;\n});\n",[215,397,398,424,445,450,458],{"__ignoreMap":232},[236,399,400,402,404,406,409,412,414,416,418,420,422],{"class":238,"line":239},[236,401,243],{"class":242},[236,403,247],{"class":246},[236,405,340],{"class":242},[236,407,408],{"class":260},"async",[236,410,411],{"class":242}," (",[236,413,254],{"class":253},[236,415,320],{"class":242},[236,417,323],{"class":253},[236,419,257],{"class":242},[236,421,261],{"class":260},[236,423,264],{"class":242},[236,425,426,429,433,436,439,442],{"class":238,"line":267},[236,427,428],{"class":260},"  const",[236,430,432],{"class":431},"suiK_"," rawBody",[236,434,435],{"class":260}," =",[236,437,438],{"class":260}," await",[236,440,441],{"class":246}," next",[236,443,444],{"class":242},"();\n",[236,446,447],{"class":238,"line":279},[236,448,449],{"class":375},"  // [intercept response]\n",[236,451,452,455],{"class":238,"line":332},[236,453,454],{"class":260},"  return",[236,456,457],{"class":242}," rawBody;\n",[236,459,460],{"class":238,"line":349},[236,461,282],{"class":242},[193,463,464,465,218],{},"Example below, always responsds with ",[215,466,467],{},"Middleware 1",[227,469,471],{"className":229,"code":470,"language":231,"meta":232,"style":232},"app\n  .use(() => \"Middleware 1\")\n  .use(() => \"Middleware 2\")\n  .get(\"/\", \"Hello\");\n",[215,472,473,478,496,511],{"__ignoreMap":232},[236,474,475],{"class":238,"line":239},[236,476,477],{"class":242},"app\n",[236,479,480,483,485,488,490,493],{"class":238,"line":267},[236,481,482],{"class":242},"  .",[236,484,247],{"class":246},[236,486,487],{"class":242},"(() ",[236,489,261],{"class":260},[236,491,492],{"class":306}," \"Middleware 1\"",[236,494,495],{"class":242},")\n",[236,497,498,500,502,504,506,509],{"class":238,"line":279},[236,499,482],{"class":242},[236,501,247],{"class":246},[236,503,487],{"class":242},[236,505,261],{"class":260},[236,507,508],{"class":306}," \"Middleware 2\"",[236,510,495],{"class":242},[236,512,513,515,518,520,523,525,528],{"class":238,"line":332},[236,514,482],{"class":242},[236,516,517],{"class":246},"get",[236,519,340],{"class":242},[236,521,522],{"class":306},"\"/\"",[236,524,320],{"class":242},[236,526,527],{"class":306},"\"Hello\"",[236,529,346],{"class":242},[190,531,532],{},[193,533,534,535,538,539,542],{},"\nIf middleware returns a value other than ",[215,536,537],{},"undefined"," or the result of ",[215,540,541],{},"next()",", it immediately intercepts request handling and sends a response.",[193,544,545],{},"When adding routes, you can register middleware that only run with them.",[227,547,549],{"className":229,"code":548,"language":231,"meta":232,"style":232},"import { basicAuth } from \"h3\";\n\napp.get(\n  \"/secret\",\n  (event) => {\n    /* ... */\n  },\n  {\n    middleware: [basicAuth({ password: \"test\" })],\n  },\n);\n",[215,550,551,568,574,582,589,601,606,610,614,631,635],{"__ignoreMap":232},[236,552,553,556,559,562,565],{"class":238,"line":239},[236,554,555],{"class":260},"import",[236,557,558],{"class":242}," { basicAuth } ",[236,560,561],{"class":260},"from",[236,563,564],{"class":306}," \"h3\"",[236,566,567],{"class":242},";\n",[236,569,570],{"class":238,"line":267},[236,571,573],{"emptyLinePlaceholder":572},true,"\n",[236,575,576,578,580],{"class":238,"line":279},[236,577,243],{"class":242},[236,579,517],{"class":246},[236,581,301],{"class":242},[236,583,584,587],{"class":238,"line":332},[236,585,586],{"class":306},"  \"/secret\"",[236,588,310],{"class":242},[236,590,591,593,595,597,599],{"class":238,"line":349},[236,592,315],{"class":242},[236,594,254],{"class":253},[236,596,257],{"class":242},[236,598,261],{"class":260},[236,600,264],{"class":242},[236,602,603],{"class":238,"line":355},[236,604,605],{"class":375},"    /* ... */\n",[236,607,608],{"class":238,"line":361},[236,609,352],{"class":242},[236,611,612],{"class":238,"line":372},[236,613,358],{"class":242},[236,615,616,619,622,625,628],{"class":238,"line":379},[236,617,618],{"class":242},"    middleware: [",[236,620,621],{"class":246},"basicAuth",[236,623,624],{"class":242},"({ password: ",[236,626,627],{"class":306},"\"test\"",[236,629,630],{"class":242}," })],\n",[236,632,633],{"class":238,"line":384},[236,634,352],{"class":242},[236,636,638],{"class":238,"line":637},11,[236,639,346],{"class":242},[193,641,642,643,320,646,649,650,653],{},"For convenience, H3 provides middleware factory functions ",[215,644,645],{},"onRequest",[215,647,648],{},"onResponse",", and ",[215,651,652],{},"onError",":",[227,655,657],{"className":229,"code":656,"language":231,"meta":232,"style":232},"import { onRequest, onResponse, onError } from \"h3\";\n\napp.use(\n  onRequest((event) => {\n    console.log(`[${event.req.method}] ${event.url.pathname}`);\n  }),\n);\n\napp.use(\n  onResponse((response, event) => {\n    console.log(`[${event.req.method}] ${event.url.pathname} ~>`, body);\n  }),\n);\n\napp.use(\n  onError((error, event) => {\n    console.log(\n      `[${event.req.method}] ${event.url.pathname} !! ${error.message}`,\n    );\n  }),\n);\n",[215,658,659,672,676,684,699,742,747,751,755,763,783,821,826,831,836,845,866,875,917,923,928],{"__ignoreMap":232},[236,660,661,663,666,668,670],{"class":238,"line":239},[236,662,555],{"class":260},[236,664,665],{"class":242}," { onRequest, onResponse, onError } ",[236,667,561],{"class":260},[236,669,564],{"class":306},[236,671,567],{"class":242},[236,673,674],{"class":238,"line":267},[236,675,573],{"emptyLinePlaceholder":572},[236,677,678,680,682],{"class":238,"line":279},[236,679,243],{"class":242},[236,681,247],{"class":246},[236,683,301],{"class":242},[236,685,686,689,691,693,695,697],{"class":238,"line":332},[236,687,688],{"class":246},"  onRequest",[236,690,250],{"class":242},[236,692,254],{"class":253},[236,694,257],{"class":242},[236,696,261],{"class":260},[236,698,264],{"class":242},[236,700,701,703,705,707,710,712,714,717,719,722,725,727,729,732,734,737,740],{"class":238,"line":349},[236,702,335],{"class":242},[236,704,273],{"class":246},[236,706,340],{"class":242},[236,708,709],{"class":306},"`[${",[236,711,254],{"class":242},[236,713,218],{"class":306},[236,715,716],{"class":242},"req",[236,718,218],{"class":306},[236,720,721],{"class":242},"method",[236,723,724],{"class":306},"}] ${",[236,726,254],{"class":242},[236,728,218],{"class":306},[236,730,731],{"class":242},"url",[236,733,218],{"class":306},[236,735,736],{"class":242},"pathname",[236,738,739],{"class":306},"}`",[236,741,346],{"class":242},[236,743,744],{"class":238,"line":355},[236,745,746],{"class":242},"  }),\n",[236,748,749],{"class":238,"line":361},[236,750,346],{"class":242},[236,752,753],{"class":238,"line":372},[236,754,573],{"emptyLinePlaceholder":572},[236,756,757,759,761],{"class":238,"line":379},[236,758,243],{"class":242},[236,760,247],{"class":246},[236,762,301],{"class":242},[236,764,765,768,770,773,775,777,779,781],{"class":238,"line":384},[236,766,767],{"class":246},"  onResponse",[236,769,250],{"class":242},[236,771,772],{"class":253},"response",[236,774,320],{"class":242},[236,776,254],{"class":253},[236,778,257],{"class":242},[236,780,261],{"class":260},[236,782,264],{"class":242},[236,784,785,787,789,791,793,795,797,799,801,803,805,807,809,811,813,815,818],{"class":238,"line":637},[236,786,335],{"class":242},[236,788,273],{"class":246},[236,790,340],{"class":242},[236,792,709],{"class":306},[236,794,254],{"class":242},[236,796,218],{"class":306},[236,798,716],{"class":242},[236,800,218],{"class":306},[236,802,721],{"class":242},[236,804,724],{"class":306},[236,806,254],{"class":242},[236,808,218],{"class":306},[236,810,731],{"class":242},[236,812,218],{"class":306},[236,814,736],{"class":242},[236,816,817],{"class":306},"} ~>`",[236,819,820],{"class":242},", body);\n",[236,822,824],{"class":238,"line":823},12,[236,825,746],{"class":242},[236,827,829],{"class":238,"line":828},13,[236,830,346],{"class":242},[236,832,834],{"class":238,"line":833},14,[236,835,573],{"emptyLinePlaceholder":572},[236,837,839,841,843],{"class":238,"line":838},15,[236,840,243],{"class":242},[236,842,247],{"class":246},[236,844,301],{"class":242},[236,846,848,851,853,856,858,860,862,864],{"class":238,"line":847},16,[236,849,850],{"class":246},"  onError",[236,852,250],{"class":242},[236,854,855],{"class":253},"error",[236,857,320],{"class":242},[236,859,254],{"class":253},[236,861,257],{"class":242},[236,863,261],{"class":260},[236,865,264],{"class":242},[236,867,869,871,873],{"class":238,"line":868},17,[236,870,335],{"class":242},[236,872,273],{"class":246},[236,874,301],{"class":242},[236,876,878,881,883,885,887,889,891,893,895,897,899,901,903,906,908,910,913,915],{"class":238,"line":877},18,[236,879,880],{"class":306},"      `[${",[236,882,254],{"class":242},[236,884,218],{"class":306},[236,886,716],{"class":242},[236,888,218],{"class":306},[236,890,721],{"class":242},[236,892,724],{"class":306},[236,894,254],{"class":242},[236,896,218],{"class":306},[236,898,731],{"class":242},[236,900,218],{"class":306},[236,902,736],{"class":242},[236,904,905],{"class":306},"} !! ${",[236,907,855],{"class":242},[236,909,218],{"class":306},[236,911,912],{"class":242},"message",[236,914,739],{"class":306},[236,916,310],{"class":242},[236,918,920],{"class":238,"line":919},19,[236,921,922],{"class":242},"    );\n",[236,924,926],{"class":238,"line":925},20,[236,927,746],{"class":242},[236,929,931],{"class":238,"line":930},21,[236,932,346],{"class":242},[934,935,936],"style",{},"html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":232,"searchDepth":267,"depth":267,"links":938},[],"Intercept request, response and errors using H3 middleware.","md",{"icon":31},{"icon":31},{"title":28,"description":939},"FO6b5sD5fPMah95KzuQ3nWg6JGCbUvhFRg0yYH2tdNU",[946,948],{"title":23,"path":24,"stem":25,"description":947,"icon":26,"children":-1},"Each request is matched to one (most specific) route handler.",{"title":33,"path":34,"stem":35,"description":949,"icon":36,"children":-1},"An event handler is a function that receives an H3Event and returns a response.",1768646387235]