Sending Response
Values returned from Event Handlers are automatically converted to a web Response by H3.
Example: Simple event handler function.
const handler = defineHandler((event) => ({ hello: "world" }));
H3 smartly converts handler into:
const handler = (event) =>
new Response(JSON.stringify({ hello: "world" }), {
headers: {
"content-type": "application/json;charset=UTF-8",
},
});
FastResponse internally to optimize performances in Node.js runtime.If the returned value from event handler is a Promise or from an async function, H3 will wait for it to resolve before sending the response.
If an error is thrown, H3 automatically handles it with error handler.
Preparing Response
Before returning a response in main handler, you can prepare response headers and status using event.res.
defineHandler((event) => {
event.res.status = 200;
event.res.statusText = "OK";
event.res.headers.set("Content-Type", "text/html");
return "<h1>Hello, World</h1>";
});
Response Types
H3 smartly converts JavaScript values into web Response.
JSON Serializable Value
Returning a JSON serializable value (object, array, number or boolean), it will be stringified using JSON.stringify() and sent with default application/json content-type.
Example:
app.get("/", (event) => ({ hello: "world" }));
.toJSON() property can customize serialization behavior. Check MDN docs for more info.String
Returning a string value, sends it as plain text body.
content-type header, it can default to text/plain;charset=UTF-8.Example: Send HTML response.
app.get("/", (event) => {
event.res.headers.set("Content-Type", "text/html;charset=UTF-8");
return "<h1>hello world</h1>";
});
You can also use html utility as shortcut.
import { html } from "h3";
app.get("/", (event) => html(event, "<h1>hello world</h1>"));
Response
Returning a web Response, sends-it as final reponse.
Example:
app.get(
"/",
(event) =>
new Response("Hello, world!", { headers: { "x-powered-by": "H3" } }),
);
Response, any prepared headers that set before, will be merged as default headers. event.res.{status,statusText} will be ignored. For performance reasons, it is best to only set headers only from final Response.ReadableStream or Readable
Returning a ReadableStream or Node.js Readable sends it as stream.
ArrayBuffer or Uint8Array or Buffer
Send binary ArrayBuffer, Uint8Array or node Buffer.
content-length header will be automatically set.
Blob
Send a Blob as stream.
Content-type and Content-Length headers will be automatically set.
File
Send a File as stream.
Content-type, Content-Length and Content-Disposition headers will be automatically set.
Special Types
Some less commonly possible values for response types.
null or undefined
Sends a response with empty body.
return statement in event handler, it is same as return undefined.Error
Retuning an Error instance will send it.
throw errors instead of returning them. This allows proper propagation from any nested utility.BigInt
Value will be sent as stringified version of BigInt number.
.toJSON. Check MDN docs for more info.Symbol or Function
Returning Symbol or Function has undetermined behavior. Currently, H3 sends a string-like representation of unknown Symbols and Functions but this behavior might be changed to throw an error in the future versions.
There are some internal known Symbols H3 internally uses:
Symbol.for("h3.notFound"): Indicate no route is found to throw a 404 error.Symbol.for("h3.handled"): Indicate request is somehow handled and H3 should not continue (Node.js specific).