Florian Margaine
Florian Margaine

Reputation: 60727

Check if a node.js module is available

I'm looking for a way to find out if a module is available.

For example, I want to check if the module mongodb is available, programmatically.

Also, it shouldn't halt the program if a module isn't found, I want to handle this myself.

PS: I added this question because Google isn't helpful.

Upvotes: 28

Views: 10962

Answers (6)

Jakob
Jakob

Reputation: 3662

For ECMAScript modules (ESM) since Node 12 the import keyword can also be used as function that returns a Promise:

import("mongodb")
  .then(mongodb => {
    // use module
  })
  .catch(e => console.error(e)) // The module hasn't been found

or

async main() {
  const mongodb = import("mongodb")
  // use module
}

main().catch(e => console.error(e)) // module hasn't been found or other error

Upvotes: 1

codeNinja
codeNinja

Reputation: 1

ES6 simple solution with 1 line of code :

const path = require('path');
const fs = require('fs');

function hasDependency(dep) {
        return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}

Upvotes: 0

Meettya
Meettya

Reputation: 345

Maybe resolve-like modules will be helpfully here?

The numbers of modules are exist on npm:

I wrote first, async-resolve, and for example:

var Resolver = require('async-resolve');
var resolver_obj = new Resolver();
resolver_obj.resolve('module', __dirname, function(err, filename) {
  return console.log(filename);
});

It use node modules path resolutions rules but don't block main loop as node do it. And in result you get filename, so it can be used to decide its local module or global and other things.

Upvotes: 0

pravdomil
pravdomil

Reputation: 2969

using ES6 arrow functions

var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }

Upvotes: -9

Stijn de Witt
Stijn de Witt

Reputation: 42065

There is a more clever way if you only want to check whether a module is available (but not load it if it's not):

function moduleAvailable(name) {
    try {
        require.resolve(name);
        return true;
    } catch(e){}
    return false;
}

if (moduleAvailable('mongodb')) {
    // yeah we've got it!
}

Upvotes: 30

Florian Margaine
Florian Margaine

Reputation: 60727

Here is the most clever way I found to do this. If anyone has a better way to do so, please point it out.

var mongodb;
try {
    mongodb = require( 'mongodb' );
}
catch( e ) {
    if ( e.code === 'MODULE_NOT_FOUND' ) {
        // The module hasn't been found
    }
}

Upvotes: 17

Related Questions