From f2d08f599bd21b1c2f649bbe39b06d70cb69321d Mon Sep 17 00:00:00 2001 From: Alex Kotliarskyi Date: Tue, 7 Apr 2015 15:52:52 -0700 Subject: [PATCH] [ReactNative] Better error message for EADDRINUSE --- packager/packager.js | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/packager/packager.js b/packager/packager.js index e2a32f2ca..55004b7cf 100644 --- a/packager/packager.js +++ b/packager/packager.js @@ -23,6 +23,7 @@ if (!fs.existsSync(path.resolve(__dirname, '..', 'node_modules'))) { process.exit(); } +var chalk = require('chalk'); var connect = require('connect'); var ReactPackager = require('./react-packager'); var blacklist = require('./blacklist.js'); @@ -88,13 +89,35 @@ console.log('\n' + ' ===============================================================\n' ); -console.log('Looking for JS files in\n ', options.projectRoots.join('\n ')); +console.log( + 'Looking for JS files in\n ', + chalk.dim(options.projectRoots.join('\n ')), + '\n' +); process.on('uncaughtException', function(e) { - console.error(e); - console.error(e.stack); - console.error('\n >>> ERROR: could not create packager - please shut down ' + - 'any existing instances that are already running.\n\n'); + if (e.code === 'EADDRINUSE') { + console.log( + chalk.bgRed.bold(' ERROR '), + chalk.red('Packager can\'t listen on port', chalk.bold(options.port)) + ); + console.log('Most likely another process is already using this port'); + console.log('Run the following command to find out which process:'); + console.log('\n ', chalk.bold('lsof -n -i4TCP:' + options.port), '\n'); + console.log('You can either shut down the other process:'); + console.log('\n ', chalk.bold('kill -9 '), '\n'); + console.log('or run packager on different port.'); + } else { + console.log(chalk.bgRed.bold(' ERROR '), chalk.red(e.message)); + var errorAttributes = JSON.stringify(e); + if (errorAttributes !== '{}') { + console.error(chalk.red(errorAttributes)); + } + console.error(chalk.red(e.stack)); + } + console.log('\nSee', chalk.underline('http://facebook.github.io/react-native/docs/troubleshooting.html')); + console.log('for common problems and solutions.'); + process.exit(1); }); var server = runServer(options, function() { @@ -151,13 +174,13 @@ function getDevToolsLauncher(options) { } // A status page so the React/project.pbxproj build script -// can verify that packager is running on 8081 and not +// can verify that packager is running on 8081 and not // another program / service. function statusPageMiddleware(req, res, next) { if (req.url === '/status') { res.end('packager-status:running'); } else { - next(); + next(); } }