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