首页 > 解决方案 > 如何在 JS 模块中定义错误类

问题描述

我正在研究一个 API,我正在尝试以一种干净的方式管理错误。所以我尝试定义一个模块来收集我可能想在我的 API 中抛出的所有错误子类。
这些类对应于我想返回给请求者的 HTTP 错误代码。我选择将它们单独放在一个模块中,因为我也会在其他几个模块中使用它们。

我想像这样使用我的错误子类:

require('../apiErrors');

function apiRequest(req, res) {
   doRequest(req, function (err, data) {
        if (err) {
            throw new BadRequestError('Request is not good');
        }
        res.send(200, data);
   }) 
}

我的模块是这样定义的:apiErrors.js

module.exports = () => {
    class UnauthorizedError extends Error {
        constructor(message) {
             super(message);
             this.name = 'UnauthorizedError';
             this.code = 403;
        }
    }

    class NotFoundError extends Error {
        constructor(message) {
            super(message);
            this.name = 'NotFoundError';
            this.code = 404;
        }
    }

    class BadRequestError extends Error {
        constructor(message) {
            super(message);
            this.name = 'BadRequestError';
            this.code = 400;
        }
    }
};

这样做的结果是一个ReferenceError: BadRequestError is not definedapiErrors在这一点上,我想知道我的做法是否确实干净,以及在导出模块时我缺少什么。

标签: javascriptnode.jses6-class

解决方案


你有两个问题:

  1. 您没有导出课程。您正在导出一个函数,如果您调用它会创建类,但随后会将它们丢弃,因为它对它们没有任何作用。

  2. 你没有对结果做任何事情require('../apiErrors');

要修复 #1,请执行以下任一操作:

class UnauthorizedError extends Error {
    constructor(message) {
         super(message);
         this.name = 'UnauthorizedError';
         this.code = 403;
    }
}

class NotFoundError extends Error {
    constructor(message) {
        super(message);
        this.name = 'NotFoundError';
        this.code = 404;
    }
}

class BadRequestError extends Error {
    constructor(message) {
        super(message);
        this.name = 'BadRequestError';
        this.code = 400;
    }
};
module.exports = {
    UnauthorizedError,
    NotFoundError,
    BadRequestError
};

或者

module.exports.UnauthorizedError = class UnauthorizedError extends Error {
    constructor(message) {
         super(message);
         this.name = 'UnauthorizedError';
         this.code = 403;
    }
};

module.exports.NotFoundError = class NotFoundError extends Error {
    constructor(message) {
        super(message);
        this.name = 'NotFoundError';
        this.code = 404;
    }
};

module.exports.BadRequestError = class BadRequestError extends Error {
    constructor(message) {
        super(message);
        this.name = 'BadRequestError';
        this.code = 400;
    }
}

要修复#2,在您刚刚使用的示例中BadRequestError

const { BadRequestError } = require('../apiErrors');

或者

const BadRequestError = require('../apiErrors').BadRequestError;

或者

const ErrorClasses = require('../apiErrors');
// ...then to use one of them...
throw new ErrorClasses.BadRequestError('Request is not good');

推荐阅读