diff options
author | 2024-03-18 19:44:46 +0530 | |
---|---|---|
committer | 2024-03-18 19:44:46 +0530 | |
commit | 29d29e8d006cc977ae11264309b8305782ee9375 (patch) | |
tree | cbdedf1b82ecf23f9a76933459e3f073818c2c80 /packages/integrations/node/src | |
parent | a3a575758c57418473626f4df6dc6318e96bef8a (diff) | |
download | astro-29d29e8d006cc977ae11264309b8305782ee9375.tar.gz astro-29d29e8d006cc977ae11264309b8305782ee9375.tar.zst astro-29d29e8d006cc977ae11264309b8305782ee9375.zip |
fix(node): handle offshoot promise rejections (#10454)
* fix(node): handle offshoot promise rejections
* add test
* add changeset
* Update packages/integrations/node/test/errors.test.js
Diffstat (limited to 'packages/integrations/node/src')
-rw-r--r-- | packages/integrations/node/src/serve-app.ts | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/packages/integrations/node/src/serve-app.ts b/packages/integrations/node/src/serve-app.ts index a9840b721..ac5af3add 100644 --- a/packages/integrations/node/src/serve-app.ts +++ b/packages/integrations/node/src/serve-app.ts @@ -1,3 +1,4 @@ +import { AsyncLocalStorage } from 'node:async_hooks'; import { NodeApp } from 'astro/app/node'; import type { RequestHandler } from './types.js'; @@ -7,8 +8,20 @@ import type { RequestHandler } from './types.js'; * Intended to be used in both standalone and middleware mode. */ export function createAppHandler(app: NodeApp): 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); + }); + return async (req, res, next, locals) => { - let request; + let request: Request; try { request = NodeApp.createRequest(req); } catch (err) { @@ -19,11 +32,11 @@ export function createAppHandler(app: NodeApp): RequestHandler { const routeData = app.match(request); if (routeData) { - const response = await app.render(request, { + const response = await als.run(request.url, () => app.render(request, { addCookieHeader: true, locals, routeData, - }); + })); await NodeApp.writeResponse(response, res); } else if (next) { return next(); |