gpt4 book ai didi

javascript - nodejs API服务器中错误处理的正确方法

转载 作者:行者123 更新时间:2023-12-04 07:56:00 28 4
gpt4 key购买 nike

我需要在 node.js 上处理我的 API 服务器中的错误。
我创建了一个错误处理模块,它将错误(仅在开发模式下)以类似于以下的 JSON 对象发送到 API 客户端:

{
"status": "fail",
"error": {
"statusCode": 404,
"status": "fail",
"isOperational": true
},
"message": "no valid register found. Please provide a valid register",
"stack": "Error: no valid register found. Please provide a valid register\n at /Users/myUser/ITstuff/smarthome-heating/controllers/modbusController.js:77:21\n at async /Users/myUser/ITstuff/smarthome-heating/controllers/modbusController.js:73:17"
}
现在我遇到的问题是,当 switch 语句中没有 case 为真时,我需要在我的 API Controller 的子模块中创建一个新错误。
// this is the modbusHandler.setValue(doc, val, next) function
// 2) RUN PROGRAMMS
let checkVal;
switch (doc.register) {
case 0:
await client.writeCoil(doc.address + offset, !!val);
checkVal = await client.readCoils(doc.address + offset, 1);
break;
case 4:
await client.writeRegister(doc.address + offset, val);
checkVal = await client.readHoldingRegisters(doc.address + offset, 1);
break;
default:
throw new Error(
'no valid register found. Please provide a valid register'
);
}
这时候,我是这样处理的:
// the function is wrapped in a try-catch statement
const val = await modbusHandler.setValue(doc, req.body.value, next).catch((err) => {
console.log('here it is');
return next(new AppError(err.message, 404));
});


res.status(200).json({
status: 'success',
data: {
val,
},
});
  • 在 API Controller 中,调用带有 switch 语句的函数
  • 如果没有大小写匹配表达式,则抛出一个新的错误
  • 捕获错误然后调用自定义错误并以 JSON 格式向客户端响应错误

  • 这个解决方案不是真的,我得到一个响应错误,因为 API Controller 的功能没有返回。这会导致第二个响应,这当然是不好的。
    我现在的问题是:我怎样才能以正确的方式解决这个问题?
    自定义错误构造函数:
    class AppError extends Error {
    constructor(message, statusCode) {
    // this is the official error message rom the error it self, this message will be in the response.json for the client
    super(message);

    this.statusCode = statusCode;
    this.status = `${statusCode}`.startsWith('4') ? 'fail' : 'error';
    this.isOperational = true;

    Error.captureStackTrace(this, this.constructor);
    }
    }

    module.exports = AppError;
    自定义错误处理程序:
    module.exports = (err, req, res, next) => {
    err.statusCode = err.statusCode || 500;
    err.status = err.status || 'error';

    if (process.env.NODE_ENV === 'development') {
    sendErrDev(err, res);
    } else if (process.env.NODE_ENV === 'production') {
    sendErrProd(err, res);
    }
    };


    const sendErrDev = (err, res) => {
    res.status(err.statusCode).json({
    status: err.status,
    error: err,
    message: err.message,
    stack: err.stack,
    });
    };

    最佳答案

    而不是抛出错误,也许希望像这样将它抛出到下一个,以便它可以由错误处理程序处理。

    export const yourFunction = async (req, res, next) => {
    .....
    // throw the error to your route Error handler
    return next(new AppError('no valid register found. Please provide a valid register', 400))
    }
    然后在所有路由声明之后,您应该有一个看起来像的错误处理程序。
    app.use(ErrorHandler);
    您可能还需要一个错误捕获器
    //catchAsync
    module.exports = fn => {
    return (req, res, next) => {
    fn(req, res, next).catch(next);
    };
    };
    您将像这样包装您的路线。
    route.get('/path/', catchAsync(yourFunction))
    如果您创建了 catchAsync 中间件,则您的路由中根本不需要任何 Try/Catch,因为所有这些都将被扔给您的错误处理程序。
    更新。
    关于 Node 的小提示,甚至 javascript 都是关于错误处理的。对于被调用函数的每一个函数,如果选择抛出错误,则需要抛出error of error的错误。你不断冒泡“抛出错误”,然后它就会失控。
    在你的 switch 语句中,我建议你返回一个空值。
    然后你测试`if (!variable) return next(new AppError);
    辅助函数的行为应该像辅助函数,它应该返回真/假/空/值,然后您在主函数中确定是否应该抛出错误。
    这样你就可以集中你的错误。

    关于javascript - nodejs API服务器中错误处理的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66700824/

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