Как обрабатывать ошибки в node.js?

Опубликовано: 1 Августа, 2021

Node.js - это расширение JavaScript, используемое для серверных сценариев. Обработка ошибок - обязательный этап в разработке приложения. Разработчик Node.js может одновременно работать как с синхронными, так и с асинхронными функциями. Обработка ошибок в асинхронных функциях важна, потому что их поведение может различаться, в отличие от синхронных функций. В то время как блоки try-catch эффективны для синхронных функций, асинхронные функции могут обрабатываться с помощью обратных вызовов, обещаний и async-await. Синхронный try-catch означает, что, если асинхронная функция выдает ошибку в синхронном блоке try / catch, ошибок не возникает. Ошибки, возникающие в приложениях Node.js, можно обрабатывать следующими способами:

  1. Использование блока try-catch
  2. Использование обратных вызовов
  3. Использование обещаний и обратных вызовов обещаний
  4. Использование async-await

Использование блока 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();

Выход:

Ошибка: выдается ошибка из-за чего-то
    в dosomething (/home/cg/root/6422736/main.js:4:11)
    при инициализации (/home/cg/root/6422736/main.js:9:9)
    на объекте. (/home/cg/root/6422736/main.js:17:1)
    в Module._compile (module.js: 570: 32)
    в Object.Module._extensions..js (module.js: 579: 10)
    в Module.load (module.js: 487: 32)
    в tryModuleLoad (module.js: 446: 12)
    в Function.Module._load (module.js: 438: 3)
    в Module.runMain (module.js: 604: 10)
    при запуске (bootstrap_node.js: 389: 7)
После успешной обработки ошибок

Объяснение: Вызывается функция init (), которая, в свою очередь, вызывает функцию dosomething (), которая генерирует объект ошибки. Этот объект ошибки перехватывается блоком catch метода init (). Если ошибка не будет обработана должным образом, программа прекратит работу. Блок 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");

Выход:

Программа завершена
[Ошибка: ENOENT: нет такого файла или каталога, 
  откройте 'C:  Users  User  Desktop  foo.txt'] {
  номер ошибки: -4058,
  код: 'ENOENT',
  системный вызов: 'открыть',
  путь: 'C:  Users  User  Desktop  foo.txt'
}

Объяснение: В этом случае файл не существует в системе, поэтому возникает ошибка.

Использование обещаний и обратных вызовов обещаний: обещания являются усовершенствованием обратных вызовов Node.js. При определении обратного вызова возвращаемое значение называется «обещанием». Ключевое различие между обещанием и обратным вызовом - это возвращаемое значение. В обратных вызовах нет концепции возвращаемого значения. Возвращаемое значение предоставляет больше возможностей для определения функции обратного вызова. Чтобы использовать обещания, модуль обещаний должен быть установлен и импортирован в приложение. Предложение .then обрабатывает вывод обещания. Если ошибка возникает в любом предложении .then или если какое-либо из вышеперечисленных обещаний отклоняется, она передается в немедленное предложение .catch. В случае отклонения обещания и отсутствия обработчика ошибок программа завершается.




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

Выход:

// В этом случае мы предполагаем, что URL неправильный
MongoError: не удалось подключиться к серверу [localhost: 27017]
// сообщение об ошибке может отличаться

Использование async-await: Async-await - это специальный синтаксис для более простой и понятной работы с обещаниями. Когда мы используем 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);

Выход:

// URL неправильный //
TypeError: не удалось получить