是否排除节点中错误堆栈的第一行?/节点中的自定义错误类型

Exclude first line of error stack in Node? / Custom Error Type in Node?

本文关键字:错误 节点 一行 类型 自定义 堆栈 排除 是否      更新时间:2023-09-26

是否有任何方法可以使用JavaScript工厂创建Error对象,而不将工厂中的行包括在堆栈中?

例如:

if (!member) {
   return next(errs.init('Invalid email address.', errs.UNAUTHORIZED));
}

产生这个:

Error: Invalid email address.
    at Object.init (/.../bin/utils/errors.util.js:21:16)
    at Query.<anonymous> (/.../routes/auth/auth.routes.js:37:30)
    at /.../node_modules/kareem/index.js:177:19
    at /.../node_modules/kareem/index.js:109:16
    at nextTickCallbackWith0Args (node.js:419:9)

堆栈的第一行实际上是工厂内部的一行。实际问题从堆栈的第二行开始。

我使用的是WebStorm,控制台窗口只显示堆栈的第一行。您必须滚动到其他行。

通过在自定义错误中重写上下文,使其在Node中工作:

function ApiError (message, status, context) {
    this.name = 'ApiError';
    this.message = message || '';
    this.status  = status || 500;
    Error.captureStackTrace(this, ( context || ApiError ));
}
require('util').inherits(ApiError, Error);
function init (message, status) {
    return (new ApiError(message, status, init));
}
module.exports = {
    init            : init,
    ApiError        : ApiError,
    BAD_REQUEST     : 400,
    UNAUTHORIZED    : 401,
    FORBIDDEN       : 403,
    NOT_FOUND       : 404,
    CONFLICT        : 409
};

这允许:

return next(errs.init('Invalid email address.', errs.UNAUTHORIZED));

return next(new errs.ApiError('Invalid email address.', errs.UNAUTHORIZED));