如何从节点模块中加载用户特定的文件?

时间:2017-02-20 04:15:59

标签: javascript node.js module

我正在创建一个应用程序可以导入的节点模块(通过npm install)。我的模块中的函数将接受在用户中设置的.json文件的位置。申请(由下面filePath指定):

...
function (filePath){
    messages = jsonfile.readFileSync(filePath);
}
...

我如何允许我的函数接受这个文件路径并以我的模块能够找到它的方式处理它,因为我的函数永远不知道用户在哪里'应用程序文件将被存储?

2 个答案:

答案 0 :(得分:1)

如果您正在编写节点库,那么您的模块将由用户的应用程序require dd保存在node_modules文件夹中。需要注意的是,您的代码只是在用户的应用程序中运行代码,因此路径将相对于用户的应用程序。

例如:让我们创建两个模块echo-fileuser-app,将自己的文件夹和自己的package.json作为自己的项目。这是一个包含两个模块的简单文件夹结构。

workspace
|- echo-file
  |- index.js
  |- package.json
|- user-app
  |- index.js
  |- package.json
  |- userfile.txt

echo-file模块

workspace/echo-file/package.json

{
  "name": "echo-file",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {"test": "echo \"Error: no test specified\" && exit 1"},
  "author": "",
  "license": "ISC"
}

workspace/echo-file/index.js(模块的入口点)

const fs = require('fs');
// module.exports defines what your modules exposes to other modules that will use your module
module.exports = function (filePath) {
    return fs.readFileSync(filePath).toString();
}

user-app模块

NPM允许您从文件夹安装包。它会将本地项目复制到您的node_modules文件夹中,然后用户可以require

初始化此npm项目后,您可以npm install --save ../echo-file并将其作为依赖项添加到用户的应用程序中。

workspace/user-app/package.json

{
  "name": "user-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {"test": "echo \"Error: no test specified\" && exit 1"},
  "author": "",
  "license": "ISC",
  "dependencies": {
    "echo-file": "file:///C:\\Users\\Rico\\workspace\\echo-file"
  }
}

workspace/user-app/userfile.txt

hello there

workspace/user-app/index.js

const lib = require('echo-file'); // require
console.log(lib('userfile.txt')); // use module; outputs `hello there` as expected
  

我如何允许我的函数接受这个文件路径并以我的模块能够找到它的方式处理它,因为我的函数永远不会知道用户应用程序文件的存储位置?

长话短说:文件路径将相对于用户的应用文件夹。

当您的模块npm install时,它会复制到node_modules。为模块提供文件路径时,它将相对于项目。节点遵循commonJS module definitionEggHead also has a good tutorial就可以了。

希望这有帮助!

答案 1 :(得分:0)

如何使用绝对路径?

如果你写在yourapp/lib/index.js.

path.join(__dirname, '../../../xx.json');