2012-06-22 5 views
3

У меня есть каталог tmp, который имеет 3 модуля test node.js [mod0.js, mod1.js, mod2.js].Не удается найти модуль при попытке автоматического импорта модулей node.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.

Если я проверил process.cwd(); в блоке if, он будет соответствовать блоку REPL.

Я пытаюсь понять, почему он работает, когда я вручную делаю это в REPL, но не автоматизирован.

+0

Попробуйте использовать 'path = path.join (__ dirname, path)' в верхней части вашей функции '_importFiles', чтобы убедиться, что переданный в' path' относительно текущего каталога. Обратите внимание, что 'path.join' - это функция из Node, поэтому вам нужно будет переименовать аргумент' path' вашей функции, чтобы предотвратить конфликт. – joshuapoehls

ответ

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' ] 

Мод файлы просты module.exports = "imported mod(x) automatically";

Так что теперь мой список возврата имеет массив. Также; Убедитесь, что у вашего каталога есть разрешения на чтение (которые, несомненно, это так)

+0

ОК, это приведет меня к решению. Моя проблема - проблема. Мой модуль импорта искал каталог tmp относительно самого модуля. Поскольку мой каталог tmp находится в каталоге sibling, он не удался. Я исправил проблему, и я решил изменить ситуацию. Благодаря! – JamesEggers

Смежные вопросы