Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: handle middleware loading error #9458

Merged
merged 4 commits into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @ematipico ! There's a tiny language error here! Can you please update to whichever feels right to you?

message: 'The middleware threw 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;
}
}
Loading