DEV Community

Cover image for ⚙️ Async Error Handling in Node.js: 4 Best Practices
Artem Turlenko
Artem Turlenko

Posted on

⚙️ Async Error Handling in Node.js: 4 Best Practices

Handling asynchronous errors effectively is crucial in Node.js applications to ensure robustness and maintainability. This article covers best practices and patterns for async error handling, including callbacks, promises, and async/await.

1. Error Handling with Callbacks

Traditionally, Node.js uses callbacks where the first parameter is an error object.

const fs = require('fs');

fs.readFile('file.txt', (err, data) => {
  if (err) {
    console.error('Error reading file:', err);
    return;
  }
  console.log(data.toString());
});
Enter fullscreen mode Exit fullscreen mode

2. Error Handling with Promises

Promises provide .catch() method to handle errors clearly and cleanly.

const fs = require('fs').promises;

fs.readFile('file.txt', 'utf-8')
  .then(data => console.log(data))
  .catch(err => console.error('Error reading file:', err));
Enter fullscreen mode Exit fullscreen mode

3. Async/Await Error Handling

Using async/await, you can handle errors elegantly using try-catch blocks.

const fs = require('fs').promises;

async function readFileAsync() {
  try {
    const data = await fs.readFile('file.txt', 'utf-8');
    console.log(data);
  } catch (err) {
    console.error('Error reading file:', err);
  }
}

readFileAsync();
Enter fullscreen mode Exit fullscreen mode

4. Centralized Error Handling with Middleware (Express.js)

In Express, you can centralize error handling using middleware.

const express = require('express');
const app = express();

app.get('/', async (req, res, next) => {
  try {
    // async operation
  } catch (err) {
    next(err);
  }
});

// Error-handling middleware
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

app.listen(3000);
Enter fullscreen mode Exit fullscreen mode

Best Practices

  • Always handle promise rejections to prevent unhandled rejections.
  • Utilize centralized error handling to simplify debugging and error logging.
  • Provide clear and meaningful error messages for easier debugging.
  • Validate and sanitize input to prevent errors.

Final Thoughts

Proper async error handling improves the resilience and maintainability of your Node.js applications. Adopting these patterns ensures your applications handle errors gracefully and predictably.

What async error handling strategies do you prefer? Share your approaches in the comments! 🚀

Top comments (0)