Kar started this conversation 6 months ago.
Unhandled Promise Rejections in Node.js are causing crashes or silent failures
In my Node.js application, sometimes an asynchronous function (e.g. a file read or HTTP request) fails, and my app either crashes or silently ignores the error. Why does this happen and how can I prevent it?
Digiaru
Posted 6 months ago
The root cause is usually an unhandled promise rejection, where a promise throws an error that isn’t caught by a .catch() block or by try…catch in an async function. 🔎 Why it happens: • Promises or async functions that reject but don’t have .catch() or try/catch lead to: o UncaughtPromiseRejectionWarning or default crashing (in recent Node versions). o Silent failures where the flow continues without handling the error arXiv+3devspeaks.com+3how-is-my-backend.whiteloves.in+3CBT Nuggets. • Streams that emit error events without listeners can crash the process LogRocket Blog.
🛠️ How to fix it
Practice Description
Use try/catch with async/await Always wrap your async logic:
try { await asyncFn(); } catch (err) { handleError(err); }
Attach .catch() to Promises Always: promiseFunction().then(...).catch(err ⇒ { /* handle */ });
Use global handlers (backup) For safety, set up:
js
CopyEdit
process.on('unhandledRejection', err => {
console.error('Unhandled rejection:', err);
// optional cleanup & exit
});
process.on('uncaughtException', err => {
console.error('Uncaught exception:', err);
process.exit(1);
});
| **Attach error handlers to streams** | Always: `<stream>.on('error', err ⇒ { /* handle or close */ });` to prevent crashes :contentReference[oaicite:15]{index=15} |
---
### 🧩 **Real-world Example**
```js
// ❌ BAD: Missing .catch()
fetchUrl('https://api.example.com/data')
.then(processData);
// ✅ FIX: Proper error handling
fetchUrl('https://api.example.com/data')
.then(processData)
.catch(err => console.error('Fetch failed:', err));
Or using async:
js
CopyEdit
async function runTask() {
try {
const result = await fetchUrl(url);
await processData(result);
} catch (err) {
console.error('Error in runTask:', err);
}
}
________________________________________
👀 Additional Recommendations
• Use linting tools like ESLint with rules that catch unhandled rejections.
• Prefer structured error handling using async/await and uniform .catch() blocks.
• Use monitoring/logging tools to detect unhandled failures in production early.