#node.js #npm
#node.js #npm
Вопрос:
Предположим, что у меня есть модуль NodeJS, который index.js
выглядит следующим образом
module.exports = function() {
var map = {},
CSV_FILE = "./input.csv",
_loadCSV = function() {
var fs = require('fs'),
parse = require('csv-parse'),
rawCSVData = fs.readFileSync(CSV_FILE).toString(),
i,
item;
parse(rawCSVData, {columns: true}, function(err, data) {
for (i = 0; i < data.length; i ) {
item = data[i];
map[item.key] = item.value;
}
});
},
_init = function() {
_loadCSV();
};
// Init
_init();
// Public
return {
/**
* getValue
*/
getValue: function(key) {
return map[key];
}
};
};
Теперь все работает нормально, если я тестирую локально. Однако, когда я устанавливаю этот модуль в другой проект, я получаю сообщение об ошибке ниже.
fs.js:549 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
^
Error: ENOENT: no such file or directory, open 'input.csv' at Error (native)
Возможно ли включить файл статического сопоставления как часть модуля NodeJS, который используется при инициализации модуля?
Ответ №1:
Ваша проблема в этой строке CSV_FILE = "./input.csv"
. Это работает локально, потому что выполняемый вами скрипт ( index.js
) находится в том же каталоге, input.csv
что и -file . Однако, когда вы устанавливаете его как зависимость, input.csv
-file на самом деле находится где-то внутри ./node_modules/your-module/input.csv
, поэтому ваш new index.js
не может видеть какой-либо ./input.csv
-file, поскольку он не находится в том же каталоге, что и вызывающий скрипт.
Есть два способа решить эту проблему, первый из которых, на мой взгляд, самый умный.
-
Не распространяйте
input.csv
-file . Это очень плохой подход к созданию модулей, и вам лучше изменить свой код, чтобы ваш модуль принимал путь к.csv
загружаемому файлу. Однако вашему модулю могут потребоваться статические данные, но в этих случаях разумнее просто преобразовать их в объект JavaScript и включить напрямую. -
Просто измените одну строку кода,
начиная сCSV_FILE = "./input.csv"
ДляCSV_FILE = __dirname "/input.csv"
Комментарии:
1. В принципе, я согласен с тем, что распространение CSV вместе с пакетом — плохой подход, поэтому я попытаюсь преобразовать его в объект JavaScript и включить его напрямую. Спасибо за оба указателя! Оцените это.