TypeError: Ok is not a constructor

Viewed 872

i have a js file in this file i have multiple class :

class ApiResponse {
  constructor(statusCode, success, message, data) {
 
  }

  Send(res) {
    res.status(statusCode).json({
      message: this.message,
      data: this.data,
      statusCode: this.statusCode,
      success: this.success,
    });
  }
};

module.exports = class BadRerquest extends ApiResponse {
  constructor(message = "عملیات نا موفق") {
    super(ResponseStatus.BAD_REQUEST, false, message, null);
  }
};

module.exports = class Ok extends ApiResponse {
  constructor(message = "عملیات با موفقیت انجام شد") {
    super(ResponseStatus.SUCCESS, true, message, null);
  }
};

and i have a BaseController i use the Ok class :

 const {
  OkObjectResultPager,
  BadRerquest,
  OkObjectResult,
  Ok,
} = require("./../../core/api/ApiRespose");

Ok(res) {
   return new Ok().Send(res);
}

and i have a RoleController , this controller inheritance the BaseController and i need to use the Ok() :

 module.exports = new (class RoleController extends BaseController {
  /***
   * Create Role
   */
  async CreateRole(req, res, next) {
      const role = new Role({
        name: req.body.name,
      });
      role.save();
      return this.Ok(res);
  }
  
})();

but when i create a Role it show me this Error :

(node:10256) UnhandledPromiseRejectionWarning: TypeError: Ok is not a constructor

whats the pronlem ? how can i solve this problem ???

3 Answers

If this is a function that uses Ok class Ok(res) {return new Ok().Send(res);}, it should have function keyword before like function Ok(res) {return new Ok().Send(res);}, but you will have error because you have your class named Ok and should change function name.

If you want to export multiple classes from your js file you have to use exports.Ok = ... or export an Object containing the references to your classes.

class BadRerquest extends ApiResponse {
  constructor(message = "عملیات نا موفق") {
    super(ResponseStatus.BAD_REQUEST, false, message, null);
  }
};

class Ok extends ApiResponse {
  constructor(message = "عملیات با موفقیت انجام شد") {
    super(ResponseStatus.SUCCESS, true, message, null);
  }
};

module.exports = {
  BadRequest: BadRequest,
  Ok: Ok
}

Please fix some issues in your code:

class BadRerquest extends ApiResponse {
  constructor(message = "عملیات نا موفق") {
    super(ResponseStatus.BAD_REQUEST, false, message, null);
  }
};

class Ok extends ApiResponse {
  constructor(message = "عملیات با موفقیت انجام شد") {
    super(ResponseStatus.SUCCESS, true, message, null);
  }
};

module.exports = { BadRequest, Ok };

new Ok() should wrapped in parentheses:

Ok(res) {
   return (new Ok()).Send(res);
}
class RoleController extends BaseController {
  /***
   * Create Role
   */
  async CreateRole(req, res, next) {
      const role = new Role({
        name: req.body.name,
      });
      role.save();
      return this.Ok(res);
  }
  
};

module.exports = new RoleController();
Related