gpt4 book ai didi

javascript - 需要一种系统地处理NodeJS项目中的错误/异常/拒绝的方法

转载 作者:行者123 更新时间:2023-11-30 00:11:39 25 4
gpt4 key购买 nike

背景资料

我正在处理一个新项目,该项目将提供可以安装的多个不同(可选)软件包,所有这些软件包都是核心软件包(仅手动软件包)的补充。其他软件包仅与核心交互。

该项目只是为了跟踪数据列表(我知道不是很具体,但是不需要这些细节)。附加软件包确定如何与数据列表进行交互。 核心软件包仅包含所有主要的JS功能,数据库模型以及身份验证。其他软件包也包含在内。

  • 假设您只想将其作为标准网页,则可以安装 webui 软件包,该软件包将绑定(bind)到核心中,并为此创建一个Web应用程序
  • 如果要创建API,可以安装 restapi 软件包,该软件包将创建RESTful接口(interface)。您还可以安装 spaui 软件包,该软件包将与RESTful接口(interface)交互,该软件包从核心
  • 获取数据

    这些插件程序包我称为“facade”程序包。从上面您真正需要推断的是, 核心是与Facade软件包分开的软件包,它处理核心功能(数据库内容,身份验证,授权等)

    问题

    核心可以使用promise或回调,并且会为失败返回异常,然后使用任何与 核心交互的外观包都可以处理异常/错误(显示HTTP错误页面,返回RESTful错误结果等)。 )。

    由于处理错误的程序包与返回错误的程序包不同,因此需要有一种系统的方法来知道返回了哪种类型的错误,因此可以正确地进行处理(例如:webui/restui程序包应该知道(如果需要显示HTTP 500,HTTP 403,HTTP 409等)。显然,核心只是返回 new Error('Something broke'),然后,facade包并不真正知道它是什么类型的错误,除非它们将文本保存在某个地方并且可以将其与错误代码匹配。



    最好的方法是什么?我还没找到任何能完全达到我想要的效果的东西。

    我最终开始了自己的尝试。

    我可能的解决方案(如果足够,请确认)

    我创建了一个新的 AppError异常类型,而不是使用简单的字符串返回 AppError异常,而是提供了一个错误代码,该代码会将该异常与错误消息,错误类型等相关联。

    这是 AppError异常的用法示例:

    exports.createThing = ( name, data ) => {
    return new Promise( ( res, rej ) => {
    if( doesItExist( name ) )
    return rej( new AppError( 'document.create.duplicateName' ) )

    // Other stuff...
    })
    }

    现在在 AppError异常方法内部,它获取 code并在异常列表内部进行查找( code应该是异常数据对象内的键)。

    以下是上述异常的异常数据对象将包含的示例:

    module.exports = {
    'document.create.duplicateName': {
    type: 'DocumentConflict',
    message: 'Failed to create new document',
    detail: 'The document name specified already exists, try another one'
    }
    }

    示例用法:假设我们尝试使用已经存在的 createThing(从 name包中)执行 webui:

    CorePackage.createThing( 'foobar', 'some data' )
    .catch( err => {
    /*
    The err is now an instance of AppError

    err.type -> DocumentConflict
    err.message -> Failed to create new document
    err.detail -> The document name specified already exists, try another one
    */
    })

    从这里开始,就像将 err.type值与合适的HTTP错误代码相关联一样简单! (可能是HTTP 409冲突)。显然,这些关联可以保留在一个对象中,从而轻松地为返回的任何错误 type值检索正确的错误代码。然后,错误代码的文本就在 err.messageerr.detail

    这也使将某种类型的语言环境轻松引入应用程序变得容易,因为出错,因为所需要做的就是编辑异常数据对象。

    发布结束

    因此,如果您认为我上面的解决方案已经足够,并且您无法想到任何问题,请这么说。我想知道它是否是。即使您想不出合适的解决方案,但您只知道我创建的解决方案都行不通,也请分享一下。

    如果您有其他解决方案,那也将同样有效!

    谢谢

    最佳答案

    我认为有两种基本方法可以解决此问题:

  • code属性:创建一个新的\Error对象,并为code属性分配有关错误的信息。例如:
    var err = new Error('Message');
    err.code = "DocumentConflict";
  • 自定义错误对象。对于每种错误类型,您可以有一个单独的Error对象。例如,您可能会遇到AppError错误,而不仅仅是DocumentConflict

  • 对于我正在创建RESTful API的项目,我喜欢从错误代码的 Angular 考虑。对于大多数项目,端点将返回以下代码之一:
  • 400(错误请求)
  • 401(凭据错误)
  • 403(禁止)
  • 404(未找到)。
  • 500(内部服务器错误)。

  • 这些然后成为我在应用程序中传递的“标准”类型的错误。普通的 Error对象被解释为内部服务器错误,因此它将始终传递500到端点。

    例如,
    CredentialsError = function (message) {
    Error.call(this, arguments);
    Error.captureStackTrace(this, this.constructor);
    this.message = message;
    };

    util.inherits(CredentialsError, Error);
    CredentialsError.prototype.name = "CredentialsError";

    然后根据需要返回/抛出一个 new CredentialsError("Invalid password")对象。要检查对象的类型,可以使用 instanceof。例如,使用Express,您可以具有类似于以下内容的错误处理程序:
    app.use(function(err, req, res, next) {
    var status;

    if (err instanceof error.FieldError) {
    status = 400;
    } else if (err instanceof error.CredentialsError) {
    status = 401;
    /* etc */
    } else {
    status = 500;
    }

    if (status !== 500) {
    res.status(status).send(JSON.stringify(
    err,
    null,
    4
    ));
    } else {
    // for 500, do not output the error!
    console.error(err.stack);
    res.status(500).send({
    message: "Internal Server Error"
    });
    }
    });

    还值得注意的是,您可以将自定义错误对象构造函数定义为不仅仅包含字符串。例如,您可以将对象传递到 BadRequestError构造函数中以提供字段级错误详细信息。

    现在,在大多数情况下,您只需传播错误,对端点的响应就很有意义。但是,在某些情况下,您希望转换错误类型。例如,如果您有一个登录端点,则可以对 findUserByEmailAddress()发出请求。这可能会返回NotFoundError对象,但是您想在 signIn()函数中捕获此对象并将其转换为CredentialsError。

    关于javascript - 需要一种系统地处理NodeJS项目中的错误/异常/拒绝的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36250489/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com