尝试自动导入 node.js 模块时出现“找不到模块”错误

3
我有一个目录tmp,其中包含3个测试node.js模块[mod0.js, mod1.js, mod2.js]
我试图编写一个函数来将这三个模块导入数组,然后返回该数组。我可以进入REPL并使用var x = require("./tmp/mod0");等导入每个文件而没有任何问题。
然而,当我尝试运行以下函数来自动化此过程时,我会收到错误消息[Error: Cannot fine module './tmp/mod0']
var _importFiles = function(path, files){
    var moduleList = []
    , trimmedName;

    files.forEach(function (element, index, array){
        if (_fs.lstatSync(path + "/" + element).isFile()){
            trimmedName =  element.substring(0, (element.length - 3));
            moduleList.push(require("./" + path + "/" + trimmedName));
        }
    });

    return moduleList;
};

我将'tmp'作为path参数传入,并将fs.readdirSync(path)的输出作为files参数传入。

如果我在if块中检查process.cwd();,它与REPL控制台的匹配。

我正在尝试弄清楚为什么在REPL中手动执行时可以正常工作,但自动化时不行。


尝试在 _importFiles 函数顶部使用 path = path.join(__dirname, path),以确保传入的 path 相对于当前目录。请注意,path.join 是 Node 的一个函数,因此您需要重命名函数的 path 参数以避免冲突。 - joshuapoehls
1个回答

1
我稍微修改了代码,变成了这样:
var _fs = require('fs');
var path = process.cwd() + '/tmp'

var _importFiles = function(path, files){
    var moduleList = [], trimmedName;

    files.forEach(function (element, index, array){
        if (_fs.lstatSync(path + "/" + element).isFile()){
            trimmedName =  element.substring(0, (element.length - 3));
            moduleList.push(require("./" + path + "/" + trimmedName));
        }
    });

    return moduleList;
};

var imports = _importFiles('./tmp', _fs.readdirSync(path));
console.log(imports);

这给了我:

$ node import.js
[ 'imported mod0 automatically', 'imported mod1 automatically' ]

这些 mod 文件很简单:module.exports = "imported mod(x) automatically";

现在我的返回列表有一个数组。另外,请确保您的目录具有读取权限(我相信它已经有了)。


好的,这让我找到了解决方案。我的问题是路径问题。我的导入模块在寻找相对于模块本身的tmp目录。由于我的tmp目录在兄弟目录中,所以它失败了。我纠正了路径问题,解决了我的情况。谢谢! - JamesEggers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接