[{"data":1,"prerenderedAt":1346},["ShallowReactive",2],{"navigation":3,"-guide-basics-handler":184,"-guide-basics-handler-surround":1341},[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":33,"body":186,"description":1335,"extension":1336,"meta":1337,"navigation":1338,"path":34,"seo":1339,"stem":35,"__hash__":1340},"content/1.guide/1.basics/4.handler.md",{"type":187,"value":188,"toc":1322,"icon":36},"minimark",[189,198,320,335,338,365,370,374,380,451,455,457,460,463,598,604,611,620,718,722,729,732,816,819,822,977,981,984,988,1010,1167,1171,1182,1188,1318],[190,191,192,193,197],"p",{},"You can define typed event handlers using ",[194,195,196],"code",{},"defineHandler",".",[199,200,205],"pre",{"className":201,"code":202,"language":203,"meta":204,"style":204},"language-js shiki shiki-themes github-light github-dark github-dark","import { H3, defineHandler } from \"h3\";\n\nconst app = new H3();\n\nconst handler = defineHandler((event) => \"Response\");\n\napp.get(\"/\", handler);\n","js","",[194,206,207,230,237,260,265,297,302],{"__ignoreMap":204},[208,209,212,216,220,223,227],"span",{"class":210,"line":211},"line",1,[208,213,215],{"class":214},"so5gQ","import",[208,217,219],{"class":218},"slsVL"," { H3, defineHandler } ",[208,221,222],{"class":214},"from",[208,224,226],{"class":225},"sfrk1"," \"h3\"",[208,228,229],{"class":218},";\n",[208,231,233],{"class":210,"line":232},2,[208,234,236],{"emptyLinePlaceholder":235},true,"\n",[208,238,240,243,247,250,253,257],{"class":210,"line":239},3,[208,241,242],{"class":214},"const",[208,244,246],{"class":245},"suiK_"," app",[208,248,249],{"class":214}," =",[208,251,252],{"class":214}," new",[208,254,256],{"class":255},"shcOC"," H3",[208,258,259],{"class":218},"();\n",[208,261,263],{"class":210,"line":262},4,[208,264,236],{"emptyLinePlaceholder":235},[208,266,268,270,273,275,278,281,285,288,291,294],{"class":210,"line":267},5,[208,269,242],{"class":214},[208,271,272],{"class":245}," handler",[208,274,249],{"class":214},[208,276,277],{"class":255}," defineHandler",[208,279,280],{"class":218},"((",[208,282,284],{"class":283},"sQHwn","event",[208,286,287],{"class":218},") ",[208,289,290],{"class":214},"=>",[208,292,293],{"class":225}," \"Response\"",[208,295,296],{"class":218},");\n",[208,298,300],{"class":210,"line":299},6,[208,301,236],{"emptyLinePlaceholder":235},[208,303,305,308,311,314,317],{"class":210,"line":304},7,[208,306,307],{"class":218},"app.",[208,309,310],{"class":255},"get",[208,312,313],{"class":218},"(",[208,315,316],{"class":225},"\"/\"",[208,318,319],{"class":218},", handler);\n",[321,322,323],"note",{},[190,324,325,326,328,329,334],{},"\nUsing ",[194,327,196],{}," is optional.\nYou can instead, simply use a function that accepts an ",[330,331,332],"a",{"href":66},[194,333,65],{}," and returns a response.",[190,336,337],{},"The callback function can be sync or async:",[199,339,341],{"className":201,"code":340,"language":203,"meta":204,"style":204},"defineHandler(async (event) => \"Response\");\n",[194,342,343],{"__ignoreMap":204},[208,344,345,347,349,352,355,357,359,361,363],{"class":210,"line":211},[208,346,196],{"class":255},[208,348,313],{"class":218},[208,350,351],{"class":214},"async",[208,353,354],{"class":218}," (",[208,356,284],{"class":283},[208,358,287],{"class":218},[208,360,290],{"class":214},[208,362,293],{"class":225},[208,364,296],{"class":218},[366,367,369],"h2",{"id":368},"object-syntax","Object Syntax",[371,372,373],"h3",{"id":373},"middleware",[190,375,376,377,379],{},"You can optionally register some ",[330,378,373],{"href":29}," to run with event handler to intercept request, response or errors.",[199,381,383],{"className":201,"code":382,"language":203,"meta":204,"style":204},"import { basicAuth } from \"h3\";\n\ndefineHandler({\n  middleware: [basicAuth({ password: \"test\" })],\n  handler: (event) => \"Hi!\",\n});\n",[194,384,385,398,402,409,426,446],{"__ignoreMap":204},[208,386,387,389,392,394,396],{"class":210,"line":211},[208,388,215],{"class":214},[208,390,391],{"class":218}," { basicAuth } ",[208,393,222],{"class":214},[208,395,226],{"class":225},[208,397,229],{"class":218},[208,399,400],{"class":210,"line":232},[208,401,236],{"emptyLinePlaceholder":235},[208,403,404,406],{"class":210,"line":239},[208,405,196],{"class":255},[208,407,408],{"class":218},"({\n",[208,410,411,414,417,420,423],{"class":210,"line":262},[208,412,413],{"class":218},"  middleware: [",[208,415,416],{"class":255},"basicAuth",[208,418,419],{"class":218},"({ password: ",[208,421,422],{"class":225},"\"test\"",[208,424,425],{"class":218}," })],\n",[208,427,428,431,434,436,438,440,443],{"class":210,"line":267},[208,429,430],{"class":255},"  handler",[208,432,433],{"class":218},": (",[208,435,284],{"class":283},[208,437,287],{"class":218},[208,439,290],{"class":214},[208,441,442],{"class":225}," \"Hi!\"",[208,444,445],{"class":218},",\n",[208,447,448],{"class":210,"line":299},[208,449,450],{"class":218},"});\n",[452,453],"read-more",{"to":39,"title":454},"Response Handling",[452,456],{"to":66},[371,458,459],{"id":459},"meta",[190,461,462],{},"You can define optional route meta attached to handlers, and access them from any other middleware.",[199,464,466],{"className":201,"code":465,"language":203,"meta":204,"style":204},"import { H3, defineHandler } from \"h3\";\n\nconst app = new H3();\n\napp.use((event) => {\n  console.log(event.context.matchedRoute?.meta); // { tag: \"admin\" }\n});\n\napp.get(\"/admin/**\", defineHandler({\n  meta: { tag: \"admin\" },\n  handler: (event) => \"Hi!\",\n})\n",[194,467,468,480,484,498,502,520,535,539,544,563,575,592],{"__ignoreMap":204},[208,469,470,472,474,476,478],{"class":210,"line":211},[208,471,215],{"class":214},[208,473,219],{"class":218},[208,475,222],{"class":214},[208,477,226],{"class":225},[208,479,229],{"class":218},[208,481,482],{"class":210,"line":232},[208,483,236],{"emptyLinePlaceholder":235},[208,485,486,488,490,492,494,496],{"class":210,"line":239},[208,487,242],{"class":214},[208,489,246],{"class":245},[208,491,249],{"class":214},[208,493,252],{"class":214},[208,495,256],{"class":255},[208,497,259],{"class":218},[208,499,500],{"class":210,"line":262},[208,501,236],{"emptyLinePlaceholder":235},[208,503,504,506,509,511,513,515,517],{"class":210,"line":267},[208,505,307],{"class":218},[208,507,508],{"class":255},"use",[208,510,280],{"class":218},[208,512,284],{"class":283},[208,514,287],{"class":218},[208,516,290],{"class":214},[208,518,519],{"class":218}," {\n",[208,521,522,525,528,531],{"class":210,"line":299},[208,523,524],{"class":218},"  console.",[208,526,527],{"class":255},"log",[208,529,530],{"class":218},"(event.context.matchedRoute?.meta); ",[208,532,534],{"class":533},"sCsY4","// { tag: \"admin\" }\n",[208,536,537],{"class":210,"line":304},[208,538,450],{"class":218},[208,540,542],{"class":210,"line":541},8,[208,543,236],{"emptyLinePlaceholder":235},[208,545,547,549,551,553,556,559,561],{"class":210,"line":546},9,[208,548,307],{"class":218},[208,550,310],{"class":255},[208,552,313],{"class":218},[208,554,555],{"class":225},"\"/admin/**\"",[208,557,558],{"class":218},", ",[208,560,196],{"class":255},[208,562,408],{"class":218},[208,564,566,569,572],{"class":210,"line":565},10,[208,567,568],{"class":218},"  meta: { tag: ",[208,570,571],{"class":225},"\"admin\"",[208,573,574],{"class":218}," },\n",[208,576,578,580,582,584,586,588,590],{"class":210,"line":577},11,[208,579,430],{"class":255},[208,581,433],{"class":218},[208,583,284],{"class":283},[208,585,287],{"class":218},[208,587,290],{"class":214},[208,589,442],{"class":225},[208,591,445],{"class":218},[208,593,595],{"class":210,"line":594},12,[208,596,597],{"class":218},"})\n",[452,599,601],{"to":600},"/guide/basics/routing#route-meta",[190,602,603],{},"It is also possible to add route meta when registering them to app instance.",[366,605,607,608],{"id":606},"handler-fetch","Handler ",[194,609,610],{},".fetch",[190,612,613,614,616,617,619],{},"Event handlers defined with ",[194,615,196],{},", can act as a web handler without even using ",[330,618,60],{"href":61}," class.",[199,621,623],{"className":201,"code":622,"language":203,"meta":204,"style":204},"const handler = defineHandler(async (event) => `Request: ${event.req.url}`);\n\nconst response = await handler.fetch(\"http://localhost/\");\nconsole.log(response, await response.text());\n",[194,624,625,667,671,696],{"__ignoreMap":204},[208,626,627,629,631,633,635,637,639,641,643,645,647,650,652,654,657,659,662,665],{"class":210,"line":211},[208,628,242],{"class":214},[208,630,272],{"class":245},[208,632,249],{"class":214},[208,634,277],{"class":255},[208,636,313],{"class":218},[208,638,351],{"class":214},[208,640,354],{"class":218},[208,642,284],{"class":283},[208,644,287],{"class":218},[208,646,290],{"class":214},[208,648,649],{"class":225}," `Request: ${",[208,651,284],{"class":218},[208,653,197],{"class":225},[208,655,656],{"class":218},"req",[208,658,197],{"class":225},[208,660,661],{"class":218},"url",[208,663,664],{"class":225},"}`",[208,666,296],{"class":218},[208,668,669],{"class":210,"line":232},[208,670,236],{"emptyLinePlaceholder":235},[208,672,673,675,678,680,683,686,689,691,694],{"class":210,"line":239},[208,674,242],{"class":214},[208,676,677],{"class":245}," response",[208,679,249],{"class":214},[208,681,682],{"class":214}," await",[208,684,685],{"class":218}," handler.",[208,687,688],{"class":255},"fetch",[208,690,313],{"class":218},[208,692,693],{"class":225},"\"http://localhost/\"",[208,695,296],{"class":218},[208,697,698,701,703,706,709,712,715],{"class":210,"line":262},[208,699,700],{"class":218},"console.",[208,702,527],{"class":255},[208,704,705],{"class":218},"(response, ",[208,707,708],{"class":214},"await",[208,710,711],{"class":218}," response.",[208,713,714],{"class":255},"text",[208,716,717],{"class":218},"());\n",[366,719,721],{"id":720},"lazy-handlers","Lazy Handlers",[190,723,724,725,728],{},"You can define lazy event handlers using ",[194,726,727],{},"defineLazyEventHandler",". This allow you to define some one-time logic that will be executed only once when the first request matching the route is received.",[190,730,731],{},"A lazy event handler must return an event handler.",[199,733,735],{"className":201,"code":734,"language":203,"meta":204,"style":204},"import { defineLazyEventHandler } from \"h3\";\n\ndefineLazyEventHandler(async () => {\n  await initSomething(); // Will be executed only once\n  return (event) => {\n    return \"Response\";\n  };\n});\n",[194,736,737,750,754,769,783,798,807,812],{"__ignoreMap":204},[208,738,739,741,744,746,748],{"class":210,"line":211},[208,740,215],{"class":214},[208,742,743],{"class":218}," { defineLazyEventHandler } ",[208,745,222],{"class":214},[208,747,226],{"class":225},[208,749,229],{"class":218},[208,751,752],{"class":210,"line":232},[208,753,236],{"emptyLinePlaceholder":235},[208,755,756,758,760,762,765,767],{"class":210,"line":239},[208,757,727],{"class":255},[208,759,313],{"class":218},[208,761,351],{"class":214},[208,763,764],{"class":218}," () ",[208,766,290],{"class":214},[208,768,519],{"class":218},[208,770,771,774,777,780],{"class":210,"line":262},[208,772,773],{"class":214},"  await",[208,775,776],{"class":255}," initSomething",[208,778,779],{"class":218},"(); ",[208,781,782],{"class":533},"// Will be executed only once\n",[208,784,785,788,790,792,794,796],{"class":210,"line":267},[208,786,787],{"class":214},"  return",[208,789,354],{"class":218},[208,791,284],{"class":283},[208,793,287],{"class":218},[208,795,290],{"class":214},[208,797,519],{"class":218},[208,799,800,803,805],{"class":210,"line":299},[208,801,802],{"class":214},"    return",[208,804,293],{"class":225},[208,806,229],{"class":218},[208,808,809],{"class":210,"line":304},[208,810,811],{"class":218},"  };\n",[208,813,814],{"class":210,"line":541},[208,815,450],{"class":218},[190,817,818],{},"This is useful to define some one-time logic such as configuration, class initialization, heavy computation, etc.",[190,820,821],{},"Another use-case is lazy loading route chunks:",[823,824,825,931],"CodeGroup",{},[199,826,829],{"className":201,"code":827,"filename":828,"language":203,"meta":204,"style":204},"import { H3, defineLazyEventHandler } from \"h3\";\n\nconst app = new H3();\n\napp.all(\n  \"/route\",\n  defineLazyEventHandler(() =>\n    import(\"./route.mjs\").then((mod) => mod.default),\n  ),\n);\n","app.mjs",[194,830,831,844,848,862,866,876,883,894,922,927],{"__ignoreMap":204},[208,832,833,835,838,840,842],{"class":210,"line":211},[208,834,215],{"class":214},[208,836,837],{"class":218}," { H3, defineLazyEventHandler } ",[208,839,222],{"class":214},[208,841,226],{"class":225},[208,843,229],{"class":218},[208,845,846],{"class":210,"line":232},[208,847,236],{"emptyLinePlaceholder":235},[208,849,850,852,854,856,858,860],{"class":210,"line":239},[208,851,242],{"class":214},[208,853,246],{"class":245},[208,855,249],{"class":214},[208,857,252],{"class":214},[208,859,256],{"class":255},[208,861,259],{"class":218},[208,863,864],{"class":210,"line":262},[208,865,236],{"emptyLinePlaceholder":235},[208,867,868,870,873],{"class":210,"line":267},[208,869,307],{"class":218},[208,871,872],{"class":255},"all",[208,874,875],{"class":218},"(\n",[208,877,878,881],{"class":210,"line":299},[208,879,880],{"class":225},"  \"/route\"",[208,882,445],{"class":218},[208,884,885,888,891],{"class":210,"line":304},[208,886,887],{"class":255},"  defineLazyEventHandler",[208,889,890],{"class":218},"(() ",[208,892,893],{"class":214},"=>\n",[208,895,896,899,901,904,907,910,912,915,917,919],{"class":210,"line":541},[208,897,898],{"class":214},"    import",[208,900,313],{"class":218},[208,902,903],{"class":225},"\"./route.mjs\"",[208,905,906],{"class":218},").",[208,908,909],{"class":255},"then",[208,911,280],{"class":218},[208,913,914],{"class":283},"mod",[208,916,287],{"class":218},[208,918,290],{"class":214},[208,920,921],{"class":218}," mod.default),\n",[208,923,924],{"class":210,"line":546},[208,925,926],{"class":218},"  ),\n",[208,928,929],{"class":210,"line":565},[208,930,296],{"class":218},[199,932,935],{"className":201,"code":933,"filename":934,"language":203,"meta":204,"style":204},"import { defineHandler } from \"h3\";\n\nexport default defineHandler((event) => \"Hello!\");\n","route.mjs",[194,936,937,950,954],{"__ignoreMap":204},[208,938,939,941,944,946,948],{"class":210,"line":211},[208,940,215],{"class":214},[208,942,943],{"class":218}," { defineHandler } ",[208,945,222],{"class":214},[208,947,226],{"class":225},[208,949,229],{"class":218},[208,951,952],{"class":210,"line":232},[208,953,236],{"emptyLinePlaceholder":235},[208,955,956,959,962,964,966,968,970,972,975],{"class":210,"line":239},[208,957,958],{"class":214},"export",[208,960,961],{"class":214}," default",[208,963,277],{"class":255},[208,965,280],{"class":218},[208,967,284],{"class":283},[208,969,287],{"class":218},[208,971,290],{"class":214},[208,973,974],{"class":225}," \"Hello!\"",[208,976,296],{"class":218},[366,978,980],{"id":979},"converting-to-handler","Converting to Handler",[190,982,983],{},"There are situations that you might want to convert an event handler or utility made for Node.js or another framework to H3.\nThere are built-in utils to do this.",[371,985,987],{"id":986},"from-web-handlers","From Web Handlers",[190,989,990,991,996,997,1001,1002,1005,1006,197],{},"Request handlers with ",[330,992,99],{"href":993,"rel":994},"https://developer.mozilla.org/en-US/docs/Web/API/Request",[995],"nofollow"," => ",[330,998,104],{"href":999,"rel":1000},"https://developer.mozilla.org/en-US/docs/Web/API/Response",[995]," signuture can be converted into H3 event handlers using ",[194,1003,1004],{},"fromWebHandler"," utility or ",[330,1007,1009],{"href":1008},"/guide/api/h3#h3mount","H3.mount",[199,1011,1013],{"className":201,"code":1012,"language":203,"meta":204,"style":204},"import { H3, fromWebHandler } from \"h3\";\n\nexport const app = new H3();\n\nconst webHandler = (request) => new Response(\"👋 Hello!\"));\n\n// Using fromWebHandler utiliy\napp.all(\"/web\", fromWebHandler(webHandler));\n\n// Using simple wrapper\napp.all(\"/web\", event => webHandler(event.req));\n\n// Using app.mount\napp.mount(\"/web\", webHandler)\n",[194,1014,1015,1028,1032,1049,1053,1084,1088,1093,1111,1115,1120,1142,1146,1152],{"__ignoreMap":204},[208,1016,1017,1019,1022,1024,1026],{"class":210,"line":211},[208,1018,215],{"class":214},[208,1020,1021],{"class":218}," { H3, fromWebHandler } ",[208,1023,222],{"class":214},[208,1025,226],{"class":225},[208,1027,229],{"class":218},[208,1029,1030],{"class":210,"line":232},[208,1031,236],{"emptyLinePlaceholder":235},[208,1033,1034,1036,1039,1041,1043,1045,1047],{"class":210,"line":239},[208,1035,958],{"class":214},[208,1037,1038],{"class":214}," const",[208,1040,246],{"class":245},[208,1042,249],{"class":214},[208,1044,252],{"class":214},[208,1046,256],{"class":255},[208,1048,259],{"class":218},[208,1050,1051],{"class":210,"line":262},[208,1052,236],{"emptyLinePlaceholder":235},[208,1054,1055,1057,1060,1062,1064,1067,1069,1071,1073,1076,1078,1081],{"class":210,"line":267},[208,1056,242],{"class":214},[208,1058,1059],{"class":255}," webHandler",[208,1061,249],{"class":214},[208,1063,354],{"class":218},[208,1065,1066],{"class":283},"request",[208,1068,287],{"class":218},[208,1070,290],{"class":214},[208,1072,252],{"class":214},[208,1074,1075],{"class":255}," Response",[208,1077,313],{"class":218},[208,1079,1080],{"class":225},"\"👋 Hello!\"",[208,1082,1083],{"class":218},"));\n",[208,1085,1086],{"class":210,"line":299},[208,1087,236],{"emptyLinePlaceholder":235},[208,1089,1090],{"class":210,"line":304},[208,1091,1092],{"class":533},"// Using fromWebHandler utiliy\n",[208,1094,1095,1097,1099,1101,1104,1106,1108],{"class":210,"line":541},[208,1096,307],{"class":218},[208,1098,872],{"class":255},[208,1100,313],{"class":218},[208,1102,1103],{"class":225},"\"/web\"",[208,1105,558],{"class":218},[208,1107,1004],{"class":255},[208,1109,1110],{"class":218},"(webHandler));\n",[208,1112,1113],{"class":210,"line":546},[208,1114,236],{"emptyLinePlaceholder":235},[208,1116,1117],{"class":210,"line":565},[208,1118,1119],{"class":533},"// Using simple wrapper\n",[208,1121,1122,1124,1126,1128,1130,1132,1134,1137,1139],{"class":210,"line":577},[208,1123,307],{"class":218},[208,1125,872],{"class":255},[208,1127,313],{"class":218},[208,1129,1103],{"class":225},[208,1131,558],{"class":218},[208,1133,284],{"class":283},[208,1135,1136],{"class":214}," =>",[208,1138,1059],{"class":255},[208,1140,1141],{"class":218},"(event.req));\n",[208,1143,1144],{"class":210,"line":594},[208,1145,236],{"emptyLinePlaceholder":235},[208,1147,1149],{"class":210,"line":1148},13,[208,1150,1151],{"class":533},"// Using app.mount\n",[208,1153,1155,1157,1160,1162,1164],{"class":210,"line":1154},14,[208,1156,307],{"class":218},[208,1158,1159],{"class":255},"mount",[208,1161,313],{"class":218},[208,1163,1103],{"class":225},[208,1165,1166],{"class":218},", webHandler)\n",[371,1168,1170],{"id":1169},"from-nodejs-handlers","From Node.js Handlers",[190,1172,1173,1174,1177,1178,1181],{},"If you have a legacy request handler with ",[194,1175,1176],{},"(req, res) => {}"," syntax made for Node.js, you can use ",[194,1179,1180],{},"fromNodeHandler"," to convert it to an h3 event handler.",[1183,1184,1185],"important",{},[190,1186,1187],{},"\nNode.js event handlers can only run within Node.js server runtime!",[199,1189,1191],{"className":201,"code":1190,"language":203,"meta":204,"style":204},"import { H3, fromNodeHandler } from \"h3\";\n\n// Force using Node.js compatibility (also works with Bun and Deno)\nimport { serve } from \"h3/node\";\n\nexport const app = new H3();\n\nconst nodeHandler = (req, res) => {\n  res.end(\"Node handlers work!\");\n};\n\napp.get(\"/web\", fromNodeHandler(nodeHandler));\n",[194,1192,1193,1206,1210,1215,1229,1233,1249,1253,1277,1292,1297,1301],{"__ignoreMap":204},[208,1194,1195,1197,1200,1202,1204],{"class":210,"line":211},[208,1196,215],{"class":214},[208,1198,1199],{"class":218}," { H3, fromNodeHandler } ",[208,1201,222],{"class":214},[208,1203,226],{"class":225},[208,1205,229],{"class":218},[208,1207,1208],{"class":210,"line":232},[208,1209,236],{"emptyLinePlaceholder":235},[208,1211,1212],{"class":210,"line":239},[208,1213,1214],{"class":533},"// Force using Node.js compatibility (also works with Bun and Deno)\n",[208,1216,1217,1219,1222,1224,1227],{"class":210,"line":262},[208,1218,215],{"class":214},[208,1220,1221],{"class":218}," { serve } ",[208,1223,222],{"class":214},[208,1225,1226],{"class":225}," \"h3/node\"",[208,1228,229],{"class":218},[208,1230,1231],{"class":210,"line":267},[208,1232,236],{"emptyLinePlaceholder":235},[208,1234,1235,1237,1239,1241,1243,1245,1247],{"class":210,"line":299},[208,1236,958],{"class":214},[208,1238,1038],{"class":214},[208,1240,246],{"class":245},[208,1242,249],{"class":214},[208,1244,252],{"class":214},[208,1246,256],{"class":255},[208,1248,259],{"class":218},[208,1250,1251],{"class":210,"line":304},[208,1252,236],{"emptyLinePlaceholder":235},[208,1254,1255,1257,1260,1262,1264,1266,1268,1271,1273,1275],{"class":210,"line":541},[208,1256,242],{"class":214},[208,1258,1259],{"class":255}," nodeHandler",[208,1261,249],{"class":214},[208,1263,354],{"class":218},[208,1265,656],{"class":283},[208,1267,558],{"class":218},[208,1269,1270],{"class":283},"res",[208,1272,287],{"class":218},[208,1274,290],{"class":214},[208,1276,519],{"class":218},[208,1278,1279,1282,1285,1287,1290],{"class":210,"line":546},[208,1280,1281],{"class":218},"  res.",[208,1283,1284],{"class":255},"end",[208,1286,313],{"class":218},[208,1288,1289],{"class":225},"\"Node handlers work!\"",[208,1291,296],{"class":218},[208,1293,1294],{"class":210,"line":565},[208,1295,1296],{"class":218},"};\n",[208,1298,1299],{"class":210,"line":577},[208,1300,236],{"emptyLinePlaceholder":235},[208,1302,1303,1305,1307,1309,1311,1313,1315],{"class":210,"line":594},[208,1304,307],{"class":218},[208,1306,310],{"class":255},[208,1308,313],{"class":218},[208,1310,1103],{"class":225},[208,1312,558],{"class":218},[208,1314,1180],{"class":255},[208,1316,1317],{"class":218},"(nodeHandler));\n",[1319,1320,1321],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}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 .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 .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":204,"searchDepth":232,"depth":232,"links":1323},[1324,1328,1330,1331],{"id":368,"depth":232,"text":369,"children":1325},[1326,1327],{"id":373,"depth":239,"text":373},{"id":459,"depth":239,"text":459},{"id":606,"depth":232,"text":1329},"Handler .fetch",{"id":720,"depth":232,"text":721},{"id":979,"depth":232,"text":980,"children":1332},[1333,1334],{"id":986,"depth":239,"text":987},{"id":1169,"depth":239,"text":1170},"An event handler is a function that receives an H3Event and returns a response.","md",{"icon":36},{"icon":36},{"title":33,"description":1335},"WsWtqk6_XL7HZvo7m5ZcCgBI_hR0O_Wu7gO9ufuoiYM",[1342,1344],{"title":28,"path":29,"stem":30,"description":1343,"icon":31,"children":-1},"Intercept request, response and errors using H3 middleware.",{"title":38,"path":39,"stem":40,"description":1345,"icon":41,"children":-1},"H3 automatically converts any returned value into a web response.",1768646387269]