[fature idea] Hook: withCustomError · Issue #569 · feathersjs-ecosystem/feathers-hooks-common · GitHub
Skip to content

[fature idea] Hook: withCustomError #569

Open

Description

@ghsamm

Hello guys,

I'm submitting the basic idea here and once you approve it, I'll add the PR with types and tests et al.

The hook is called withCustomError and it can be used to change errors thrown by other hooks.

The scenario goes like this: I want to use the disable hook but return a 404 NotFound error instead of the default MethodNotAllowed error.

Basically, instead of writing the following e.g:

disallow("external") // throws MethodNotAllowed

We would wrap it in a withCustomError utility hook, like so:

withCustomError(disallow("extenral"), () => new NotFound()) // throws NotFound

The basic code goes like this:

const withCustomError = (hook, errorCreator) => (context: any) => {
  try {
   // if the hook does not produce an error, no need to throw
    const res = hook(context);
    return res;
  } catch (err) {
    throw errorCreator(context);
  }
};

We can also use function composition to create a new disallow404 like so:

const disallow404 = (...providers) => withCustomError(disallow(...providers), () => new NotFound());

What do you think ?

Activity

  1. changed the title [-]Hook idea: withCustomError[/-] [+][fature idea] Hook: withCustomError[/+] on Jan 28, 2020
  2. 1valdis commented on Feb 13, 2020

    @1valdis

    That would definitely be useful if an error needs to be, for example, localized.

  3. michaelwiles commented on Dec 28, 2023

    @michaelwiles

    +1

  4. michaelwiles commented on Dec 28, 2023

    @michaelwiles

    For the record, in case anyone else copies this, an await is required before the call to the internal hook.

    const withCustomError = (hook, errorCreator) => (context: any) => {
      try {
       // if the hook does not produce an error, no need to throw
        const res = await hook(context);
        return res;
      } catch (err) {
        throw errorCreator(context);
      }
    };
  5. fratzinger commented on Feb 18, 2025

    @fratzinger
    Collaborator

    Thanks for the suggestion and sorry for the late response. I started working on a massive rewrite of the package (#764). It's not released yet and will take a few weeks.

    This should be working then. I took a more drastical approach. I introduced a new hook called throwIfIsProvider which basically works the same as disallow but has a more clear naming and has an error option to change the error, see https://github.com/feathersjs-ecosystem/feathers-hooks-common/blob/modernize/src/hooks/throw-if/throw-if-is-provider.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions