📜  如何处理 Node.js 中异步代码的错误?(1)

📅  最后修改于: 2023-12-03 15:38:42.641000             🧑  作者: Mango

如何处理 Node.js 中异步代码的错误?

在 Node.js 中开发的过程中,我们经常会处理异步代码的错误,这些错误通常是由回调函数中的异常或者 Promise 中的 reject 异常所触发。如果我们不好好地处理这些错误,就可能会导致服务器崩溃或者程序出现其他不可预知的错误。

本篇文章将介绍如何处理 Node.js 中异步代码的错误,以避免出现意外的错误。

错误处理方式

在 Node.js 中,有两种常见的处理异步代码错误的方式:

1. 使用 try catch

我们可以在异步代码的外部使用 try catch 来捕获错误,以处理异常。例如:

function readFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

async function read() {
  try {
    const data = await readFile('path/to/file');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

2. 使用 Promise.catch

在 Promise 中,我们可以使用 catch 方法来捕获错误并进行处理。例如:

function readFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

readFile('path/to/file')
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.error(err);
  });

两种方法都可以处理异步代码中的错误,但是在实际开发中,我们通常倾向于使用 Promise.catch 方法,因为它更为简洁明了。

错误传递方式

在 Node.js 中,错误传递有两种方式:一种是通过回调函数传递错误,另一种是通过 Promise.reject 抛出错误。在实际开发中,我们通常使用 Promise.reject 来抛出错误,并在 Promise.catch 中进行处理。

function readFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

function readAllFiles() {
  return Promise.all([
    readFile('path/to/file1'),
    readFile('path/to/file2'),
    readFile('path/to/file3'),
  ]);
}

readAllFiles()
  .then(([data1, data2, data3]) => {
    console.log(data1, data2, data3);
  })
  .catch((err) => {
    console.error(err);
  });
错误处理工具

在 Node.js 中,有一些错误处理工具可以帮助我们更好地处理异步代码的错误。

1. assert

assert 模块用于检查条件是否为真,若为假,则会抛出 AssertionError。我们可以将 assert 用于验证函数的输入和输出是否符合预期。

const assert = require('assert');

function add(a, b) {
  assert(typeof a === 'number' && typeof b === 'number', 'both a and b should be numbers');
  return a + b;
}

console.log(add(1, 2)); // 3
console.log(add('a', 1)); // AssertionError: both a and b should be numbers
2. joi

joi 是一个用于定义数据结构的库,我们可以使用它来验证函数的输入参数是否符合预期。

const joi = require('joi');

function getUser(id) {
  const schema = joi.number().integer().min(1).required();
  const { error } = schema.validate(id);
  if (error) {
    return Promise.reject(error.details[0].message);
  }
  return User.findById(id);
}

getUser('a')
  .then((user) => {
    console.log(user);
  })
  .catch((err) => {
    console.error(err); // child "value" fails because ["value" must be a number]
  });
总结

错误处理是 Node.js 开发中重要的一环,合理的错误处理方式和错误处理工具可以帮助我们尽可能地避免程序的异常终止、数据的损失等意外情况。在开发中,我们应该时刻关注异步代码的错误处理,以保证代码的稳定性和可靠性。