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

📅  最后修改于: 2022-05-13 01:56:25.284000             🧑  作者: Mango

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

JavaScript 中的异步操作是不阻塞进一步操作的操作。这意味着如果我们在代码中的某个点执行异步操作,那么之后的代码将被执行并且不会等待该异步操作完成。 Node.js 中的一个异步操作示例是当我们从 Web 服务器请求一些数据时。

如果我们想在 Node.js 中处理异步代码的错误,那么我们可以通过以下两种方式来实现。

  • 使用回调处理错误
  • 处理 Promise 拒绝

使用回调处理错误:回调函数是在函数执行完成后执行一些操作。我们可以在异步操作完成后调用我们的回调函数。如果出现错误,我们可以使用该错误调用回调函数,否则我们可以使用错误作为 null 并将异步操作的结果作为参数调用它。

项目设置:

第 1 步:如果您还没有安装 Node.js。

第 2 步:为您的项目创建一个文件夹,然后将cd (更改目录)放入其中。在该文件夹中创建一个名为 app.js 的新文件。

项目结构:按照这些步骤操作后,您的项目结构将如下所示。

在下面提到的代码示例中,我们使用 setTimeout() 方法模拟了一个异步操作。我们执行除法运算,在 1 秒后返回除法结果,如果除数为零,我们将错误实例传递给回调方法。如果没有错误,我们调用回调函数,错误为null,除法结果为参数。错误和结果在我们的回调函数中处理。

app.js
const divide = (a, b, callback) => {
  setTimeout(() => {
    if (b == 0) {
      callback(new Error('Division by zero error'));
    } else {
      callback(null, a / b);
    }
  }, 1000);
};
  
divide(10, 2, (err, res) => {
  if (err) {
    console.log(err.message);
  } else {
    console.log(`The result of division = ${res}`);
  }
});
  
divide(5, 0, (err, res) => {
  if (err) {
    console.log(err.message);
  } else {
    console.log(`The result of division = ${res}`);
  }
});


app.js
const divide = async (a, b) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (b == 0) {
        reject(new Error('Division by zero error'));
      } else {
        resolve(a / b);
      }
    }, 1000);
  });
};
  
// Consuming the promise using then() method
// and handling the rejected promise using
// catch() method
divide(5, 0)
  .then((res) => {
    console.log(`The result of division is ${res}`);
  })
  .catch((err) => {
    console.log(err.message);
  });
  
// This function is immedietly invoked after
// its execution. In this case we consume the
// promise returned by divide function() using
// async/await and handle the error using
// try/catch block
(async () => {
  try {
    const res = await divide(10, 5);
    console.log(`The result of division is ${res}`);
  } catch (err) {
    console.log(err);
  }
})();


运行应用程序的步骤:您可以在命令行上使用以下命令执行 app.js 文件。

node app.js

输出:

处理 Promise 拒绝: Node.js 中的 Promise 是一种处理异步操作的方法。当我们从异步函数返回一个 promise 时,稍后可以使用 then() 方法或 async/await 来获取最终值。当我们使用 then() 方法来消费 Promise 并且我们必须处理 Promise 拒绝时,我们可以调用 then() 方法调用的 catch() 调用。 Promise.catch() 是一个返回 Promise 的方法,它的工作是处理被拒绝的 Promise。

句法:

// func is an async function
func().then(res => {   
    // code logic
}).catch(err => {
    // promise rejection handling logic
})

现在,如果我们想使用 async/await 处理 Promise 拒绝,那么我们可以使用简单的 try/catch 块轻松完成,如下面给出的语法所示。

const hello = async () => {
    try {
        // func is an async function
        const res = await func();
    } catch(err) {
        // error handling logic
    }
}

在下面的示例中,我们使用 setTimeout() 方法模拟了一个异步函数,并在返回 Promise 的异步函数中执行除法操作。如果除数为零,我们会以错误拒绝承诺,否则我们会以除法的结果来解决它。

应用程序.js

const divide = async (a, b) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (b == 0) {
        reject(new Error('Division by zero error'));
      } else {
        resolve(a / b);
      }
    }, 1000);
  });
};
  
// Consuming the promise using then() method
// and handling the rejected promise using
// catch() method
divide(5, 0)
  .then((res) => {
    console.log(`The result of division is ${res}`);
  })
  .catch((err) => {
    console.log(err.message);
  });
  
// This function is immedietly invoked after
// its execution. In this case we consume the
// promise returned by divide function() using
// async/await and handle the error using
// try/catch block
(async () => {
  try {
    const res = await divide(10, 5);
    console.log(`The result of division is ${res}`);
  } catch (err) {
    console.log(err);
  }
})();

输出: