重构原始错误,以使用数组返回mongodb错误的无效数据

3phpmpom  于 2023-01-04  发布在  Go
关注(0)|答案(3)|浏览(132)

我正在使用错误处理和Express,我曾经使用数组返回MongoDB错误的无效数据
我以前

else if (process.env.NODE_ENV === 'production') {
    
    let error = { ...err };

    if (error.name === 'CastError') error = handleCastErrorDB(error);
    if (error.code === 11000) error = handleDuplicateFieldsDB(error);
    if (error.name === 'ValidationError')
      error = handleValidationErrorDB(error);

    sendErrorProd(err, res);
  }

但它不适用于进程。env. NODE_ENV ==='生产'
因为let(错误={... err};)

olhwl3o2

olhwl3o21#

err有可枚举属性吗?我猜是it doesn't,所以对象扩展语法不会将任何内容复制到对象文字中。您可能希望简单地使用原始的err对象,我认为您的代码应该

if (process.env.NODE_ENV === 'production') {
    let error;
    if (err.name === 'CastError')
        error = handleCastErrorDB(err);
    else if (err.code === 11000)
        error = handleDuplicateFieldsDB(err);
    else if (err.name === 'ValidationError')
        error = handleValidationErrorDB(err);
    else
        error = { ...err };

    sendErrorProd(err, res);
}
5lwkijsr

5lwkijsr2#

它对我的工作就像这样

else if (process.env.NODE_ENV === 'production') {
    //

    if (err.name === 'CastError') err = handleCastErrorDB(err);
    if (err.code === 11000) err = handleDuplicateFieldsDB(err);
    if (err.name === 'ValidationError')
      err = handleValidationErrorDB(err);

    sendErrorProd(err, res);
  }

但输出如下所示

{
    "status": "fail",
    "message": "Duplicate field value: \"The Snow Adventurer2\". Please use another value!"
}

这只是11000错误,我有另一个错误与CastError & ValidationError。
我需要在一条消息中显示所有错误。
这些都是代码

const handleCastErrorDB = err => {
  const message = `Invalid ${err.path}: ${err.value}.`;
  return new AppError(message, 400);
};

const handleDuplicateFieldsDB = err => {
  const value = err.errmsg.match(/(["'])(\\?.)*?\1/)[0];
  console.log(value);

  const message = `Duplicate field value: ${value}. Please use another value!`;
  return new AppError(message, 400);
};
const handleValidationErrorDB = err => {
  const errors = Object.values(err.errors).map(el => el.message);

  const message = `Invalid input data. ${errors.join('. ')}`;
  return new AppError(message, 400);
};

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

const sendErrorProd = (err, res) => {
  // Operational, trusted error: send message to client
  if (err.isOperational) {
    res.status(err.statusCode).json({
      status: err.status,
      message: err.message
    });

    // Programming or other unknown error: don't leak error details
  } else {
    // 1) Log error
    console.error('ERROR 💥', err);

    // 2) Send generic message
    res.status(500).json({
      status: 'error',
      message: 'Something went very wrong!'
    });
  }
};

module.exports = (err, req, res, next) => {
  // console.log(err.stack);

  err.statusCode = err.statusCode || 500;
  err.status = err.status || 'error';

  if (process.env.NODE_ENV === 'development') {
    sendErrorDev(err, res);
  } else if (process.env.NODE_ENV === 'production') {
    
    let error = { ...err };

    if (error.name === 'CastError') error = handleCastErrorDB(error);
    if (error.code === 11000) error = handleDuplicateFieldsDB(error);
    if (error.name === 'ValidationError')
      error = handleValidationErrorDB(error);

    sendErrorProd(err, res);
  }
};
62lalag4

62lalag43#

我有一个问题,这个代码。我怎么能处理下面的问题??

export default (err, req, res, next) => {
   console.log(err.stack);

  err.statusCode = err.statusCode || 500;
  err.status = err.status || 'error';

  if (process.env.NODE_ENV === 'development') {
    sendErrorDev(err, res);
  } else if (process.env.NODE_ENV === 'production') {
    
    let error = { ...err };

    if (err.name === 'CastError') error = handleCastErrorDB(err);
    if (err.code === 11000) error = handleDuplicateFieldsDB(err);
    if (err.name === 'ValidationError')
      error = handleValidationErrorDB(error);

    sendErrorProd(err, res);

problem

相关问题