I need to check whether "mocha" is installed, before running it. I came up with the following code:
try {
var mocha = require("mocha");
} catch(e) {
console.error(e.message);
console.error("Mocha is probably not found. Try running `npm install mocha`.");
process.exit(e.code);
}
I dont like the idea to catch an exception. Is there a better way?
To check for all locally installed packages and their dependencies, navigate to the project folder in your terminal and run the npm list command. You can also check if a specific package is installed locally or not using the npm list command followed by package name.
js Built-in Modules. Node. js has a set of built-in modules which you can use without any further installation.
Not committing node_modules implies you need to list all your modules in the package. json (and package-lock. json ) as a mandatory step. This is great because you might not have the diligence to do so, and some of the npm operations might break if you don't.
You can always copy node_modules and then run npm install or npm update in the new project to make sure you've got up-to-date versions. npm will use the files in node_modules as a cache and should only bring down newer content if required. In short: it won't hurt.
You should use require.resolve()
instead of require()
. require
will load the library if found, but require.resolve()
will not, it will return the file name of the module.
See the documentation for require.resolve
try {
console.log(require.resolve("mocha"));
} catch(e) {
console.error("Mocha is not found");
process.exit(e.code);
}
require.resolve() does throw error if module is not found so you have to handle it.
module.paths
stores array of search paths for require
. Search paths are relative to the current module from where require
is called. So:
var fs = require("fs");
// checks if module is available to load
var isModuleAvailableSync = function(moduleName)
{
var ret = false; // return value, boolean
var dirSeparator = require("path").sep
// scan each module.paths. If there exists
// node_modules/moduleName then
// return true. Otherwise return false.
module.paths.forEach(function(nodeModulesPath)
{
if(fs.existsSync(nodeModulesPath + dirSeparator + moduleName) === true)
{
ret = true;
return false; // break forEach
}
});
return ret;
}
And asynchronous version:
// asynchronous version, calls callback(true) on success
// or callback(false) on failure.
var isModuleAvailable = function(moduleName, callback)
{
var counter = 0;
var dirSeparator = require("path").sep
module.paths.forEach(function(nodeModulesPath)
{
var path = nodeModulesPath + dirSeparator + moduleName;
fs.exists(path, function(exists)
{
if(exists)
{
callback(true);
}
else
{
counter++;
if(counter === module.paths.length)
{
callback(false);
}
}
});
});
};
Usage:
if( isModuleAvailableSync("mocha") === true )
{
console.log("yay!");
}
Or:
isModuleAvailable("colors", function(exists)
{
if(exists)
{
console.log("yay!");
}
else
{
console.log("nay:(");
}
});
Edit: Note:
module.paths
is not in the API
require
but I couldn't make it work (I'm on Windows XP).If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With