Как включить файл статического сопоставления как часть модуля NodeJS?

#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, поскольку он не находится в том же каталоге, что и вызывающий скрипт.

Есть два способа решить эту проблему, первый из которых, на мой взгляд, самый умный.

  1. Не распространяйте input.csv -file . Это очень плохой подход к созданию модулей, и вам лучше изменить свой код, чтобы ваш модуль принимал путь к .csv загружаемому файлу. Однако вашему модулю могут потребоваться статические данные, но в этих случаях разумнее просто преобразовать их в объект JavaScript и включить напрямую.

  2. Просто измените одну строку кода,
    начиная с CSV_FILE = "./input.csv"
    Для CSV_FILE = __dirname "/input.csv"

См. Документацию для __dirname

Комментарии:

1. В принципе, я согласен с тем, что распространение CSV вместе с пакетом — плохой подход, поэтому я попытаюсь преобразовать его в объект JavaScript и включить его напрямую. Спасибо за оба указателя! Оцените это.