MST

星途 面试题库

面试题:Node.js 异步编程中如何优雅地处理错误

在一个复杂的 Node.js 应用中,存在多层异步调用和多个异步任务。请描述如何通过合理的错误处理机制,确保无论是单个异步操作失败,还是多个异步操作并发执行时其中某个失败,整个应用都能有恰当的错误处理和状态恢复。请举例说明,可使用 Promise、async/await 等技术。
14.9万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 使用 Promise 的错误处理
    • 单个异步操作
      • 在 Node.js 中,许多异步操作可以用 Promise 包装。例如读取文件操作,Node.js 原生的 fs.readFile 是基于回调的,我们可以将其包装成 Promise。
      const fs = require('fs');
      const { promisify } = require('util');
      const readFile = promisify(fs.readFile);
      
      readFile('nonexistentfile.txt', 'utf8')
       .then(data => {
            console.log(data);
        })
       .catch(err => {
            console.error('读取文件失败:', err);
            // 这里可以进行状态恢复操作,比如记录日志,尝试其他文件读取路径等
        });
      
    • 多个异步操作并发执行
      • 使用 Promise.all 来处理多个异步任务并发执行。假设我们有多个文件读取任务。
      const fs = require('fs');
      const { promisify } = require('util');
      const readFile = promisify(fs.readFile);
      
      const filePaths = ['file1.txt', 'nonexistentfile.txt', 'file3.txt'];
      const promises = filePaths.map(path => readFile(path, 'utf8'));
      
      Promise.all(promises)
       .then(data => {
            console.log('所有文件读取成功:', data);
        })
       .catch(err => {
            console.error('其中一个文件读取失败:', err);
            // 进行状态恢复,比如记录失败的文件路径,尝试重新读取等
        });
      
  2. 使用 async/await 的错误处理
    • 单个异步操作
      const fs = require('fs');
      const { promisify } = require('util');
      const readFile = promisify(fs.readFile);
      
      async function readSingleFile() {
          try {
              const data = await readFile('nonexistentfile.txt', 'utf8');
              console.log(data);
          } catch (err) {
              console.error('读取文件失败:', err);
              // 进行状态恢复操作
          }
      }
      
      readSingleFile();
      
    • 多个异步操作并发执行
      const fs = require('fs');
      const { promisify } = require('util');
      const readFile = promisify(fs.readFile);
      
      async function readMultipleFiles() {
          const filePaths = ['file1.txt', 'nonexistentfile.txt', 'file3.txt'];
          const promises = filePaths.map(path => readFile(path, 'utf8'));
          try {
              const data = await Promise.all(promises);
              console.log('所有文件读取成功:', data);
          } catch (err) {
              console.error('其中一个文件读取失败:', err);
              // 进行状态恢复操作
          }
      }
      
      readMultipleFiles();
      

通过 try - catch 块(在 async/await 中)或者 .catch 方法(在 Promise 链中),我们可以捕获异步操作中的错误,并进行相应的错误处理和状态恢复。在状态恢复时,可以根据具体业务需求,例如记录错误日志、尝试重试操作、回滚部分操作等。