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