将抛出的错误写入 Javascript 中的文件

Writing thrown errors to a file in Javascript

有没有办法将 javascript 中的默认行为添加到 throw 事件。 就像我在抛出错误时尝试添加到文件中一样:

示例:

 if (tables.length === 0) {
      throw new Error("NO_TABLES_RETRIEVED");
    }

我想先写入文件再抛出错误。我知道我可以添加一个函数,就在抛出之前我可以调用该函数但只是想知道更多是否有类似添加默认行为的东西?

您可以创建自己的自定义错误并在构造函数中执行一些逻辑。

function MyError(){
  //do some logic herer (e.g. write to file)
  console.log("some logic");
}

throw new MyError()

如果您使用的是 NodeJS 应用程序,则可以集中管理所有抛出的错误。

您还应该为您的错误命名:

class ApiError extends Error {

  constructor (message, code) {
  super(message);
  this.name = 'ApiError';
  this.code = code;
  }
}

同样对其他错误类型使用其他名称。

对于快速申请,

app.use(routes);

// place this after your routes in express app. This will catch all your thrown errors.
app.use(function (err, req, res, next) {
    console.log(err);

    switch (err.name) {
      case 'ApiError':
        // write to file here
        return res.status(err.code || 500).send({error: err.message});

      case 'Some other error':
       // handle differently
       break;

      default:
       res.status(err.status || 500).render('500', {error: err});
   }
});

请注意,如果您从 Promise 中抛出 async/await,这将不会捕获您的错误。您将不得不以其他方式集中捕获它们,可能是通过在您的应用程序中捕获所有未处理的 Promise Rejections

process.on('unhandledRejection', (reason) => {
  console.log(reason);
  // log error in file
});

同样,你也应该集中捕获所有未捕获的异常

process.on('uncaughtException', (err) => {
  console.log(err);
  // log error in file
});

建议: 就文件中的日志记录错误而言,只有当您通过其他方式解析文件、将文件发送到 logstash 等时,这是一种很好的方法。

如果您不打算以编程方式解析文件,请将错误记录在 errordb / error-table 中。这样查询起来要容易得多:)

Error 不同于 Javascript w.r.t NodeJS 中的 Exception。错误是错误 class 的任何实例。错误可能会被构建,然后直接传递给另一个函数或被抛出。当你抛出一个错误时,它就变成了一个异常。2 下面是一个使用错误作为异常的例子:

throw new Error('something bad happened');

但是你也可以创建一个错误而不抛出它:

callback(new Error('something bad happened'));

由于您在评论中提到您不想在应用程序的所有文件中都需要错误处理程序文件。您还可以使用 NodeJS EventEmitter module 或使用错误处理程序中间件

我认为最好的办法是使用自定义投掷。我实际上总是这样做,能够写

_throw("MyErrorMessage")

所以我会做这样的事情:

//Should use something like dot-env with the path to your errors 
require('dotenv').config()

//I'm just gonna fake it to make it work on your machine:
process.env.error_file_path = './myErrors.txt'


//throwLib.js
const util = require('util')
const fs = require('fs')
const writeFile = util.promisify(fs.appendFile)

_throw = (stringError) => {
    writeFile(process.env.error_file_path, "Error : " + stringError + "\n").then(err => {
        if (err)
            console.log(err)
        throw new Error(stringError)
    }
    )
}
//import this in your files.
//myFile.js


//someStuff
_throw('someMessage1')
_throw('someMessage2')
_throw('someMessage3')