diff --git a/src/commands/main.ts b/src/commands/main.ts index 451dd0307b3..9f790266d17 100644 --- a/src/commands/main.ts +++ b/src/commands/main.ts @@ -37,30 +37,43 @@ import { createStatusCommand } from './status/index.js' import { createSwitchCommand } from './switch/index.js' import { createUnlinkCommand } from './unlink/index.js' import { createWatchCommand } from './watch/index.js' - +import { AddressInUseError } from './types.js' const SUGGESTION_TIMEOUT = 1e4 -process.on('uncaughtException', async (err) => { - console.log('') - error( - `${chalk.red( - 'Netlify CLI has terminated unexpectedly', - )}\nThis is a problem with the Netlify CLI, not with your application.\nIf you recently updated the CLI, consider reverting to an older version by running:\n\n${chalk.bold( - 'npm install -g netlify-cli@VERSION', - )}\n\nYou can use any version from ${chalk.underline( - 'https://ntl.fyi/cli-versions', - )}.\n\nPlease report this problem at ${chalk.underline( - 'https://ntl.fyi/cli-error', - )} including the error details below.\n`, - { exit: false }, - ) - - const systemInfo = await getSystemInfo() - - console.log(chalk.dim(err.stack || err)) - console.log(chalk.dim(systemInfo)) - - reportError(err, { severity: 'error' }) +process.on('uncaughtException', async (err: AddressInUseError | Error) => { + if ('code' in err && err.code === 'EADDRINUSE') { + error( + `${chalk.red(`Port ${err.port} is already in use`)}\n\n` + + `Your serverless functions might be initializing a server\n` + + `to listen on specific port without properly closing it.\n\n` + + `This behavior is generally not advised\n` + + `To resolve this issue, try the following:\n` + + `1. If you NEED your serverless function to listen on a specific port,\n` + + `use a randomly assigned port as we do not officially support this.\n` + + `2. Review your serverless functions for lingering server connections, close them\n` + + `3. Check if any other applications are using port ${err.port}\n`, + { exit: false }, + ) + } else { + error( + `${chalk.red( + 'Netlify CLI has terminated unexpectedly', + )}\nThis is a problem with the Netlify CLI, not with your application.\nIf you recently updated the CLI, consider reverting to an older version by running:\n\n${chalk.bold( + 'npm install -g netlify-cli@VERSION', + )}\n\nYou can use any version from ${chalk.underline( + 'https://ntl.fyi/cli-versions', + )}.\n\nPlease report this problem at ${chalk.underline( + 'https://ntl.fyi/cli-error', + )} including the error details below.\n`, + { exit: false }, + ) + + const systemInfo = await getSystemInfo() + + console.log(chalk.dim(err.stack || err)) + console.log(chalk.dim(systemInfo)) + reportError(err, { severity: 'error' }) + } process.exit(1) }) diff --git a/src/commands/types.d.ts b/src/commands/types.d.ts index dce9224fe7c..bfeb5c28cfe 100644 --- a/src/commands/types.d.ts +++ b/src/commands/types.d.ts @@ -73,3 +73,11 @@ export type NetlifyOptions = { state: StateConfig frameworksAPIPaths: FrameworksAPIPaths } + +export interface AddressInUseError extends Error { + code: 'EADDRINUSE' + errno: number + syscall: 'listen' + address: string + port: number +}