如何将静态映射文件包含在nodeJS模块中?

时间:2016-10-05 00:04:34

标签: node.js npm

假设我有一个node {{{}}如下

的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];
        }
    };
};

是否可以将静态映射文件作为nodeJS模块的一部分包含在模块初始化中?

1 个答案:

答案 0 :(得分:1)

您的问题就在这一行CSV_FILE = "./input.csv"。它在本地工作,因为您执行的脚本(index.js)与input.csv - 文件位于同一目录中。但是,当您将其作为依赖项安装时,input.csv - 文件实际上位于./node_modules/your-module/input.csv中的某个位置,因此您的 index.js无法看到任何内容./input.csv - 文件,因为它与调用脚本不在同一目录中。

有两种方法可以解决这个问题,第一种方法是我认为最聪明。

  1. 不要分发input.csv - 文件。这是构建模块的一种非常糟糕的方法,您应该更改代码,以便模块接受其加载的.csv文件的路径。但是,您的模块可能需要静态数据,但在这些情况下,只需将其转换为JavaScript对象并直接包含它就更明智。

  2. 只需更改一行代码,
    来自CSV_FILE = "./input.csv"
    CSV_FILE = __dirname + "/input.csv"

  3. 请参阅documentation for __dirname