createAppHandler() — astro Function Reference
Architecture documentation for the createAppHandler() function in serve-app.ts from the astro codebase.
Entity Profile
Dependency Diagram
graph TD 8323d38f_c948_9920_2eff_297399c26640["createAppHandler()"] 5b6342d4_34c1_b338_e76a_caf786fff1fb["serve-app.ts"] 8323d38f_c948_9920_2eff_297399c26640 -->|defined in| 5b6342d4_34c1_b338_e76a_caf786fff1fb style 8323d38f_c948_9920_2eff_297399c26640 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
packages/integrations/node/src/serve-app.ts lines 10–71
export function createAppHandler(app: NodeApp, options: Options): RequestHandler {
/**
* Keep track of the current request path using AsyncLocalStorage.
* Used to log unhandled rejections with a helpful message.
*/
const als = new AsyncLocalStorage<string>();
const logger = app.getAdapterLogger();
process.on('unhandledRejection', (reason) => {
const requestUrl = als.getStore();
logger.error(`Unhandled rejection while rendering ${requestUrl}`);
console.error(reason);
});
const originUrl = options.experimentalErrorPageHost
? new URL(options.experimentalErrorPageHost)
: undefined;
const prerenderedErrorPageFetch = originUrl
? (url: string) => {
const errorPageUrl = new URL(url);
errorPageUrl.protocol = originUrl.protocol;
errorPageUrl.host = originUrl.host;
return fetch(errorPageUrl);
}
: undefined;
return async (req, res, next, locals) => {
let request: Request;
try {
request = NodeApp.createRequest(req, {
allowedDomains: app.getAllowedDomains?.() ?? [],
});
} catch (err) {
logger.error(`Could not render ${req.url}`);
console.error(err);
res.statusCode = 500;
res.end('Internal Server Error');
return;
}
// Redirects are considered prerendered routes in static mode, but we want to
// handle them dynamically, so prerendered routes are included here.
const routeData = app.match(request, true);
// But we still want to skip prerendered pages.
if (routeData && !(routeData.type === 'page' && routeData.prerender)) {
const response = await als.run(request.url, () =>
app.render(request, {
addCookieHeader: true,
locals,
routeData,
prerenderedErrorPageFetch,
}),
);
await NodeApp.writeResponse(response, res);
} else if (next) {
return next();
} else {
const response = await app.render(req, { addCookieHeader: true, prerenderedErrorPageFetch });
await NodeApp.writeResponse(response, res);
}
};
}
Domain
Subdomains
Defined In
Source
Frequently Asked Questions
What does createAppHandler() do?
createAppHandler() is a function in the astro codebase, defined in packages/integrations/node/src/serve-app.ts.
Where is createAppHandler() defined?
createAppHandler() is defined in packages/integrations/node/src/serve-app.ts at line 10.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free