Skip to content

Commit

Permalink
fix: handle middleware loading error (#9458)
Browse files Browse the repository at this point in the history
* fix: handle middleware loading error

* remove the try/catch

* rethrow error

* Update packages/astro/src/core/middleware/loadMiddleware.ts

Co-authored-by: Arsh <69170106+lilnasy@users.noreply.github.com>

---------

Co-authored-by: Arsh <69170106+lilnasy@users.noreply.github.com>
  • Loading branch information
ematipico and lilnasy authored Dec 19, 2023
1 parent 429be8c commit fa3078c
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 4 deletions.
5 changes: 5 additions & 0 deletions .changeset/selfish-rings-occur.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Correctly handle the error in case the middleware throws a runtime error
20 changes: 20 additions & 0 deletions packages/astro/src/core/errors/errors-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -780,6 +780,26 @@ export const LocalsNotAnObject = {
hint: 'If you tried to remove some information from the `locals` object, try to use `delete` or set the property to `undefined`.',
} satisfies ErrorData;

/**
* @docs
* @description
* Thrown in development mode when middleware throws an error while attempting to loading it.
*
* For example:
* ```ts
* import {defineMiddleware} from "astro:middleware";
* throw new Error("Error thrown while loading the middleware.")
* export const onRequest = defineMiddleware(() => {
* return "string"
* });
* ```
*/
export const MiddlewareCantBeLoaded = {
name: 'MiddlewareCantBeLoaded',
title: "Can't load the middleware.",
message: 'The middleware thrown an error while Astro was trying to loading it.',
} satisfies ErrorData;

/**
* @docs
* @see
Expand Down
10 changes: 6 additions & 4 deletions packages/astro/src/core/middleware/loadMiddleware.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { ModuleLoader } from '../module-loader/index.js';
import { MIDDLEWARE_MODULE_ID } from './vite-plugin.js';
import { MiddlewareCantBeLoaded } from '../errors/errors-data.js';
import { AstroError } from '../errors/index.js';

/**
* It accepts a module loader and the astro settings, and it attempts to load the middlewares defined in the configuration.
Expand All @@ -8,9 +10,9 @@ import { MIDDLEWARE_MODULE_ID } from './vite-plugin.js';
*/
export async function loadMiddleware(moduleLoader: ModuleLoader) {
try {
const module = await moduleLoader.import(MIDDLEWARE_MODULE_ID);
return module;
} catch {
return void 0;
return await moduleLoader.import(MIDDLEWARE_MODULE_ID);
} catch (error: any) {
const astroError = new AstroError(MiddlewareCantBeLoaded, undefined, { cause: error });
throw astroError;
}
}

0 comments on commit fa3078c

Please sign in to comment.