diff options
author | 2025-02-05 16:05:26 +0000 | |
---|---|---|
committer | 2025-02-05 16:05:26 +0000 | |
commit | 43a37c1956d415c54bb5847e3b29927e16bef1e3 (patch) | |
tree | 67c7b4b086c1d41e5a09c1c64dab3aa01e541310 /packages/integrations/node/src/middleware.ts | |
parent | 817fe553899d0a8a0e4ff27c8d062bf1e24ca566 (diff) | |
parent | 0f3e23b50afe3f6f82caaf3e964c451280aa0688 (diff) | |
download | astro-43a37c1956d415c54bb5847e3b29927e16bef1e3.tar.gz astro-43a37c1956d415c54bb5847e3b29927e16bef1e3.tar.zst astro-43a37c1956d415c54bb5847e3b29927e16bef1e3.zip |
Merge branch 'main' of ../../temp/adapters into move-node
Diffstat (limited to 'packages/integrations/node/src/middleware.ts')
-rw-r--r-- | packages/integrations/node/src/middleware.ts | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/packages/integrations/node/src/middleware.ts b/packages/integrations/node/src/middleware.ts new file mode 100644 index 000000000..5bb104914 --- /dev/null +++ b/packages/integrations/node/src/middleware.ts @@ -0,0 +1,43 @@ +import type { NodeApp } from 'astro/app/node'; +import { createAppHandler } from './serve-app.js'; +import type { RequestHandler } from './types.js'; + +/** + * Creates a middleware that can be used with Express, Connect, etc. + * + * Similar to `createAppHandler` but can additionally be placed in the express + * chain as an error middleware. + * + * https://expressjs.com/en/guide/using-middleware.html#middleware.error-handling + */ +export default function createMiddleware(app: NodeApp): RequestHandler { + const handler = createAppHandler(app); + const logger = app.getAdapterLogger(); + // using spread args because express trips up if the function's + // stringified body includes req, res, next, locals directly + return async (...args) => { + // assume normal invocation at first + const [req, res, next, locals] = args; + // short circuit if it is an error invocation + if (req instanceof Error) { + const error = req; + if (next) { + return next(error); + // biome-ignore lint/style/noUselessElse: <explanation> + } else { + throw error; + } + } + try { + await handler(req, res, next, locals); + } catch (err) { + logger.error(`Could not render ${req.url}`); + console.error(err); + if (!res.headersSent) { + // biome-ignore lint/style/noUnusedTemplateLiteral: <explanation> + res.writeHead(500, `Server error`); + res.end(); + } + } + }; +} |