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



我开始制作我的第一个节点模块。这很简单,它只是从用户那里获取输入,并通过将其与大型数据文件进行比较来验证它是否有效。数据文件只是一个 json 对象。这是索引的代码.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的数据以便它可用于我的两个函数的正确方法是什么?

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

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

需求始终相对于模块本身,而不是相对于当前工作目录。节点.js了解这是一个 JSON 文件并相应地对其进行解析。

通常,您可以通过 __dirname 变量获取对模块所在目录的引用。因此,以下内容也有效:

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

最新更新