节点模块包括数据文件作为全局变量

时间:2014-12-08 21:33:55

标签: javascript node.js module

我开始制作我的第一个节点模块。它非常简单,它只需要用户输入并通过将其与大型数据文件进行比较来验证它是否有效。数据文件只是一个json对象。这是index.js的代码

// borrowed heavily from http://quickleft.com/blog/creating-and-publishing-a-node-js-module
/**
* Valiate a NAICS codes using 2012 NAICS codes
*
* @param  {String} 2 to 6 digit numeric
* @return {Boolean}
*/

var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('codes.json', 'utf8'));

module.exports = {
  validateNAICS: function(inNAICS) {

    inNAICS = inNAICS || "";
    if (inNAICS.length > 6) { return false };
    if (inNAICS.length < 2) { return false };
    if (obj.hasOwnProperty(inNAICS)) { return true };
    return false;
  },

  /**
  * Given a NAICS code return the industry name
  *
  * @param  {String} 2 to 6 digit numeric
  * @return {String}
  */

  translateNAICS: function(inNAICS) {
    inNAICS = inNAICS || "000";

    if (obj.hasOwnProperty(inNAICS)) { return obj[inNAICS] };

    return "Unknown";
  }
};

但是,当我尝试在项目中使用它时,代码似乎在项目的根目录中而不是在模块根目录中查找codes.js。我能够通过复制codes.js并将其放在项目的根目录中来证明这一点,并且一切都按预期工作。

那么从codes.js中包含数据的正确方法是什么,以便它可用于我的两个函数?

1 个答案:

答案 0 :(得分:0)

最简单的方法是通过相对路径名简单require

var obj = require('./codes.json');

需求始终相对于模块本身,而不是当前工作目录。 Node.js understand that this is a JSON file并相应地解析它。

通常,您可以通过__dirname变量获取模块所在目录的引用。所以以下工作也是如此:

var path = require('path');
var obj = JSON.parse(fs.readFileSync(path.join(__dirname, 'codes.json'), 'utf8'));