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