How to check in node if module exists and if exists to load?

node.jsExpress

node.js Problem Overview


I need to check if file/(custom)module js exists under some path. I tried like

var m = require('/home/test_node_project/per');
but it throws error when there is no per.js in path. I thought to check with fs if file exists but I don't want to add '.js' as suffix if is possible to check without that. How to check in node if module exists and if exists to load ?

node.js Solutions


Solution 1 - node.js

Require is a synchronous operation so you can just wrap it in a try/catch.

try {
    var m = require('/home/test_node_project/per');
    // do stuff
} catch (ex) {
    handleErr(ex);
}

Solution 2 - node.js

You can just try to load it and then catch the exception it generates if it fails to load:

try {
    var foo = require("foo");
}
catch (e) {
    if (e instanceof Error && e.code === "MODULE_NOT_FOUND")
        console.log("Can't load foo!");
    else
        throw e;
}

You should examine the exception you get just in case it is not merely a loading problem but something else going on. Avoid false positives and all that.

Solution 3 - node.js

It is possible to check if the module is present, without actually loading it:

function moduleIsAvailable (path) {
    try {
        require.resolve(path);
        return true;
    } catch (e) {
        return false;
    }
}

Documentation:

> ### require.resolve(request[, options]) > > Use the internal require() machinery to look up the location of a module, but rather than loading the module, just return the resolved filename.

Note: Runtime checks like this will work for Node apps, but they won't work for bundlers like browserify, WebPack, and React Native.

Solution 4 - node.js

You can just check is a folder exists by using methods:

var fs = require('fs');

if (fs.existsSync(path)) {
    // Do something
}

// Or

fs.exists(path, function(exists) {
    if (exists) {
        // Do something
    }
});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDamirView Question on Stackoverflow
Solution 1 - node.jsChevView Answer on Stackoverflow
Solution 2 - node.jsLouisView Answer on Stackoverflow
Solution 3 - node.jsjoeytwiddleView Answer on Stackoverflow
Solution 4 - node.jsJaroslavView Answer on Stackoverflow