如果模块存在且是否存在要加载,如何检入节点?

Dam*_*mir 45 node.js express

我需要检查文件/(自定义)模块js是否存在于某个路径下.我尝试过

var m = require('/home/test_node_project/per');
但是当路径中没有per.js时会抛出错误.我想检查 fs文件是否存在但我不想添加'.js'后缀,如果可以检查没有它.如果模块存在且是否存在要加载,如何检入节点?

Che*_*hev 74

Require是一个同步操作,因此您可以将其包装在try/catch中.

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

  • 不是真的,但没有理由你不能制作自己的require函数并在其中进行这些检查,所以不是抛出错误就可以返回false. (3认同)

Lou*_*uis 39

您可以尝试加载它,然后捕获它无法加载时生成的异常:

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;
}
Run Code Online (Sandbox Code Playgroud)

您应该检查您获得的异常,以防它不仅仅是一个加载问题而且还有其他问题.避免误报和所有这些.

  • @WillHoskings通常,在语句`throw e`中,`e`可能是原始类型。例如,您可以`抛出“ blah”。如果发生这种情况,那么您在catch(e)中获得的错误对象将不是Error对象,并且将使测试e instanceof Error失败。x可能是某个对象,但根本不是从Error派生的对象。如果需要,您可以*跳过`e instanceof Error`。由您决定测试的第二部分是否对您“足够好”。 (2认同)

joe*_*dle 11

可以检查模块是否存在,而不实际加载它:

function moduleIsAvailable (path) {
    try {
        require.resolve(path);
        return true;
    } catch (e) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

文档:

require.resolve(request [,options])

使用内部的require()机制来查找模块的位置,而不是加载模块,只需返回已解析的文件名.

注意:像这样的运行时检查适用于Node应用程序,但它们不适用于browserify,WebPack和React Native等捆绑程序.


小智 5

您可以使用方法检查是否存在文件夹:

var fs = require('fs');

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

// Or

fs.exists(path, function(exists) {
    if (exists) {
        // Do something
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 还不够-您需要检查所有可能的`node_modules`文件夹和注册的扩展名(.js .json .node以及可能的.coffee) (2认同)