📜  如何处理 node.js 中的错误?

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

如何处理 node.js 中的错误?

Node.js 是用于服务器端脚本的 JavaScript 扩展。错误处理是应用程序开发中的一个强制性步骤。 Node.js 开发人员可以同时使用同步和异步函数。处理异步函数中的错误很重要,因为与同步函数不同,它们的行为可能会有所不同。虽然 try-catch 块对同步函数有效,但异步函数可以处理回调、promise 和 async-await。 Try-catch 是同步的意味着如果异步函数在同步 try/catch 块中抛出错误,则不会抛出错误。 Node.js 应用程序中抛出的错误可以通过以下方式处理:

  1. 使用 try-catch 块
  2. 使用回调
  3. 使用 Promise 和 Promise 回调
  4. 使用异步等待

使用 try-catch 块: try-catch 块可用于处理代码块引发的错误。

function dosomething(){
    throw new Error(
    'a error is thrown from dosomething');
}
  
function init(){
    try{
        dosomething();
    }
    catch(e){
        console.log(e);
    }
 console.log(
    "After successful error handling");
}
  
init();

输出:

Error: a error is thrown from dosomething
    at dosomething (/home/cg/root/6422736/main.js:4:11)
    at init (/home/cg/root/6422736/main.js:9:9)
    at Object. (/home/cg/root/6422736/main.js:17:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:389:7)
After successful error handling

说明:调用了 init()函数,该函数又调用了抛出错误对象的 dosomething()函数。这个错误对象被 init() 方法的 catch 块捕获。如果没有正确处理错误,程序将终止。 catch 块打印调用堆栈以显示发生错误的点。

使用回调:回调是在完成特定任务时调用的函数。回调在 Node.js 中被广泛使用,因为它可以防止任何阻塞,并允许同时运行其他代码。程序不等待文件读取完成并继续打印“程序结束”,同时继续读取文件。如果出现系统中不存在文件等错误,则在“程序结束”后打印错误,否则输出文件内容。

var fs = require("fs");
  
fs.readFile('foo.txt', function (err, data) {
   if (err) {
       console.error(err);
}else{
   console.log(data.toString());
}
});
  
console.log("Program Ended");

输出:

Program Ended
[Error: ENOENT: no such file or directory, 
  open 'C:\Users\User\Desktop\foo.txt'] {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Users\\User\\Desktop\\foo.txt'
}

说明:在这种情况下,系统中不存在该文件,因此引发错误。

使用 Promise 和 Promise 回调: Promise 是对 Node.js 回调的增强。在定义回调时,返回的值称为“承诺”。 Promise 和回调之间的主要区别在于返回值。回调中没有返回值的概念。返回值为定义回调函数提供了更多控制。为了使用 Promise,必须在应用程序中安装和导入 Promise 模块。 .then 子句处理承诺的输出。如果在任何 .then 子句中发生错误,或者如果上面的任何 promise 被拒绝,它就会被传递给直接的 .catch 子句。如果 promise 被拒绝,并且没有错误处理程序,则程序终止。

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/TestDB';
  
MongoClient.connect(url)
    .then(function(err, db) {
        db.collection('Test').updateOne({
            "Name": "Joe"
        }, {
            $set: {
                "Name": "Beck"
            }
        });
    });
   .catch(error => alert(error.message)) 

输出:

// In this case we assume the url is wrong
MongoError: failed to connect to server [localhost:27017]
// error message may vary

使用 async-await:async- await 是一种特殊的语法,可以以更简单且易于理解的方式处理 Promise。当我们使用 async/await 时, .then 被 await 替换,它处理函数中的等待。错误处理由 .catch 子句完成。 Async-await 也可以包装在 try-catch 块中以进行错误处理。如果不存在错误处理程序,则程序由于未捕获的错误而终止。

async function f() {
  let response = await fetch('http://xyzurl');
}
  
// f() becomes a rejected promise
f().catch(alert);

输出:

// the url is wrong //
TypeError: failed to fetch