【问题标题】:Relative path for data file in NodeJS moduleNodeJS模块中数据文件的相对路径
【发布时间】:2020-08-08 08:09:00
【问题描述】:

我创建了一个 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.js typescript path node-modules


    【解决方案1】:

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

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

    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 将始终是运行模块代码的目录的完整路径。

    【讨论】:

    • 正是我需要的,我不知道__dirname。非常感谢!
    猜你喜欢
    • 2020-05-21
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多