3

I have a code sniped from another project with custom errors in a RESTful API. This all worked fine until i refactored it to typescript. I did not understand how the error construktor works and this.response is not know in this scope.

How i throw this error

async function authenticate(request, response, next) {
    if(!request.body.email) {
        return next(new ErrorREST(Errors.BadRequest, "User name missing."));
    }
}

error.js

const Errors = {
  BadRequest: {
    status: 400,
    message: "Request has wrong format."
  },
  Unauthorized: {
    status: 401,
    message: "Authentication credentials not valid."
  },
  Forbidden: {
    status: 403,
    message: "You're missing permission to execute this request."
  }
}

class ErrorREST extends Error {
  constructor(type, detail = undefined, ...args) {
    super(...args);

    if (typeof type !== 'object') {
      return new Error("You need to provide the error type.");
    }

    this.response = type;

    if (detail !== undefined) {
      this.response.detail = detail;
    }
  }
}

I have not found a similar solution. This solution provides predefined errors with additional custom messages.

2
  • 1
    It's not obvious what the issue is here. The type parameter needs have a type of { status: number, message: string}. If not that, what is your question? Commented Feb 26, 2019 at 23:36
  • This is a good hint, but the main problem was this.response is not known in this scope. And because I don't know how this works in JavaScript i cant fix it in typescript Commented Feb 28, 2019 at 12:37

1 Answer 1

3

JavaScript create this.response at the moment you call it. So i create this field and typecript knew it.

Second problem was, i defined my routes in the app.ts after my error handling.

error.ts

const Errors = {
  BadRequest: {
    status: 400,
    message: "Request has wrong format."
  },
  Unauthorized: {
    status: 401,
    message: "Authentication credentials not valid."
  },
  Forbidden: {
    status: 403,
    message: "You're missing permission to execute this request."
  }
}

export class ErrorREST extends Error {
   public response: { status: number; message: string; detail: string };

    constructor(error: { status: number, message: string }, detail: string = undefined, ...args) {
       super(...args);
       this.response = {status: error.status, message: error.message, detail: detail};
   }
}

app.ts

 this.express.use('/api/users', usersRouter);

 this.express.use(function (error, request, response, next) {

      logRequest(console.error, request);
      console.error("ERROR OCCURRED:");
      console.error(error);

   if (error == null || error.response == null) {//error is not a custom error
      error = new ErrorREST(Errors.InternalServerError);
   } 

   response.status(error.response.status).send(error.response);

return your error to user

return next(new ErrorREST(Errors.Unauthorized));
return next(new ErrorREST(Errors.Unauthorized), "Authentication credentials not valid.");

Custom RestError in Insomnia

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.