Nodejs Error Fixes
Error: The operation was aborted due to timeout (AbortSignal.timeout / TimeoutError)
AbortSignal.timeout(ms) fires an abort after the given duration, which surfaces wherever the signal was passed — most commonly into fetch() — as a TimeoutError (a DOMException). Catch it specifically and check `error.name === 'TimeoutError'` to distinguish it from other abort reasons or network failures.
Node.js test runner: mock timers don't actually advance time
The built-in node:test runner's mock timers need to be enabled for the specific APIs you're using (`t.mock.timers.enable({ apis: ['setTimeout'] })`), and you must explicitly call `t.mock.timers.tick(ms)` to advance them — otherwise real timers keep running and your assertions just time out.
TypeError: crypto.randomUUID is not a function
crypto.randomUUID() was added to Node's built-in crypto module and later to the global Web Crypto object. This error usually means you're running an older Node runtime that predates it, or a different `crypto` (a browser polyfill, or a same-named local variable) is shadowing the built-in module.
DeprecationWarning: Buffer() is deprecated due to security and usability issues
The legacy `new Buffer(...)` constructor is deprecated because it could accidentally expose uninitialized memory. Replace it with `Buffer.from(...)`, `Buffer.alloc(...)`, or `Buffer.allocUnsafe(...)` depending on whether you're wrapping existing data or allocating new memory.
npm error ERESOLVE: unable to resolve dependency tree
Two of your dependencies require conflicting versions of the same peer dependency, and npm (since v7) refuses to silently guess which one to use. Update the conflicting packages to compatible versions where possible; `--legacy-peer-deps` is a last resort that may install a version that isn't actually compatible.
Error: Access to this API has been restricted (EPERM) when running Node with --permission
You started Node with the security permission model (`--permission`) but didn't grant access to the specific resource your code touches. Filesystem paths, child processes, and worker threads each need explicit flags like `--allow-fs-read`, `--allow-fs-write`, or `--allow-child-process`.
Error: postMessage could not be cloned — DataCloneError in worker_threads
Like structuredClone(), worker_threads' postMessage() uses the structured clone algorithm under the hood, so it can't send functions, class instances, or open handles across the thread boundary. Pass plain data, or use transferable objects (like ArrayBuffer) for large binary payloads instead of copying them.
DOMException: Could not be cloned — DataCloneError from structuredClone()
structuredClone() can't clone functions, class instances with non-plain internals, or objects holding open handles — it only supports the structured clone algorithm's data types. Strip the object down to plain, clonable data first, or write a manual serialization step for the parts that don't qualify.
Error: Unknown file extension ".ts" — running a TypeScript file directly with node
Plain `node file.ts` fails because Node doesn't transpile TypeScript by default. Use a runner like `tsx` or `ts-node`, or Node's built-in type-stripping support (`node --experimental-strip-types file.ts` on recent Node versions) for files that only use erasable type syntax.
Error: The module was compiled against a different Node.js version (NODE_MODULE_VERSION mismatch)
A native (C++) addon was compiled against a different Node.js ABI version than the one you're currently running — typically after upgrading Node without reinstalling native dependencies. Delete node_modules and reinstall, or run a rebuild, so the addon is recompiled against your current Node version.
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string (fs/promises)
You passed something other than a string, Buffer, or URL as the `path` argument to an `fs/promises` function — most often `undefined`, because a variable wasn't populated yet, or a plain object instead of a path string.
TypeError: fetch failed — cause: ECONNRESET (Node.js built-in fetch/undici)
Node's built-in `fetch` (powered by undici) throws a generic `TypeError: fetch failed` and buries the actual reason inside `error.cause`. Log `error.cause` to see the real network error (ECONNRESET, ETIMEDOUT, a TLS certificate error, etc.) instead of debugging the wrapper message alone.
Warning: MaxListenersExceededWarning: Possible EventEmitter memory leak detected
You've attached more than the default 10 listeners for the same event on one EventEmitter — usually because a listener gets added inside a function that runs repeatedly (a request handler, a retry loop) instead of once at startup. Fix the leak; only raise the limit with `setMaxListeners()` if the count is genuinely expected.
Node.js process crashes with an unhandled promise rejection instead of just warning
Since Node.js 15, an unhandled promise rejection terminates the process by default instead of only printing a warning. Add a top-level `process.on('unhandledRejection', ...)` as a safety net, but the real fix is making sure every async call path actually has a `.catch()` or a surrounding try/catch.
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath is not defined by exports
The package defines an `exports` field in its package.json that doesn't list the deep path you're importing (e.g. `some-lib/dist/internal/thing`). Packages using `exports` block any subpath not explicitly declared there, even if the file physically exists — import from the package's documented public entry point instead.
Error [ERR_MODULE_NOT_FOUND]: relative import is missing its file extension
Node's native ESM resolver requires fully specified relative import paths, including the extension — `import './utils'` fails; it must be `import './utils.js'`. This trips people up constantly when migrating a CommonJS or bundler-based project to native ESM.
Error [ERR_REQUIRE_ESM]: require() of ES Module not supported
You're using require() on a package that only ships ES Modules (it declares "type": "module" or only exports .mjs). Either switch your file to ESM and use import, or use a dynamic import() instead of require().