首页 > 解决方案 > NodeJS模块中数据文件的相对路径

问题描述

我创建了一个 NodeJS 模块,用 typescript 编写(尽管它不应该改变任何东西)。

以下是它的组织方式:

.
├── data/
│   └── MY_DATA_FILES.json
│
├── src/
│   ├── data/
│   │   └── data.ts
│   │
│   └── OTHER_TYPESCRIPT_FILES.ts
│
├── dist/
│   ├── data/
│   │   └── data.js
│   │
│   └── OTHER_JAVASCRIPT_FILES.ts
│
├── package.json
└── tsconfig.json

我的目标是从文件中读取数据data.ts文件。当我当前的工作目录位于模块的根目录时,这不是问题(然后会是./data/...),但是当我将其用作模块并将其放置在nodes_modules/目录中时,我不确定如何处理这种情况。

我目前正在阅读以下文件:

import fs from 'fs';
const basePath = './data';
const filesPath = 'subdirectory/my_data.json';

export function getData(): any {
    const fileFullPath  = basePath + '/' + filesPath;
    const contents = fs.readFileSync(fileFullPath);

    // [...]
}

但是在这里,我basePath的依赖于我的工作目录。我可以将其设置为./node_modules/my_module/data,但我知道这不是正确的方法..

任何帮助将不胜感激,谢谢!

标签: node.jstypescriptpathnode-modules

解决方案


您通常会为每个位置构建一个相对于您的代码所在目录的路径,并以相对方式访问所需位置。您的代码位置将作为__dirname. 然后,您可以结合该相对路径__dirname来构建到目标位置的完整路径,而无需对模块的安装位置或方式进行任何假设。

因此,假设您的代码在src目录中,那将是__dirname指向的位置。要访问该data目录下的src目录,您可以使用:

let srcDataDir = path.join(__dirname, "data");

要访问该dist/data目录,您可以使用:

let distDataDir = path.join(__dirname, '../dist/data');

要访问更高级别的数据目录MY_DATA_FILES.json,您可以使用:

let topDataDir = path.join(__dirname, '../data');

如您所见,关键是从您知道的位置构建所有相关内容,并将其__dirname作为代码自己目录的位置传递给代码。

在 Javascript 的模块中,您永远不想对当前工作目录做出任何假设,因为这实际上可以是任何东西。这由顶级程序本身以及程序的启动方式控制,而不是模块本身可以依赖或做出假设的任何东西。但__dirname始终是运行模块代码的目录的完整路径。


推荐阅读