我应该如何解析传递给节点模块的路径
How should I resolve a path passed to a node module?
我正在努力创建我的第一个 Node.js 模块,并且很难确定处理此问题的最佳方法。将文件路径作为用户输入接收到模块的推荐方法是什么?然后我该如何解决它在哪里?用户调用我的模块的位置和我运行的代码的位置位于两个不同的地方。
让我们更进一步。假设用户有一个 JSON 配置文件,其中包含以下路径的数组(在 config/settings.json 中):
{
"paths": [
"../path1",
"path2",
"/path/to/path3",
"~/path4"
]
}
现在显然这些路径是相对于配置文件的,而不是任何正在执行的代码。这感觉是错误的,因为现在我的方法必须接受__dirname
,配置文件相对于__dirname
的路径等。
var mymodule = require('mine');
mymodule(__dirname, './config/settings.json');
然后,我从配置中读取的任何文件都必须基于此配置文件的位置。这感觉很奇怪。建议?
来自 FileUtils 源代码:
var updateFileProperties = function (file, path){
file._path = null;
file._usablePath = null;
file._isAbsolute = false;
if (path === undefined || path === null) return;
path = PATH.normalize (path);
var index = path.indexOf (":") + 1;
var windowsRoot = path.substring (0, index);
path = path.substring (index);
//https://github.com/joyent/node/issues/3066
if (path[0] === "/" && path[1] === "/"){
path = path.replace (/['/]/g, "''");
path = path.substring (0, path.length - 1);
}
file._isAbsolute = path[0] === SLASH;
file._path = windowsRoot + path;
file._usablePath = file._isAbsolute ? file._path : (windowsRoot + PATH.join (file._relative, path));
};
var File = function (path){
var main = process.mainModule.filename;
var cwd = main.substring (0, main.lastIndexOf (SLASH));
var relative = PATH.relative (process.cwd (), cwd);
this._relative = relative;
//...omitted
updateFileProperties (this, path);
};
这段代码解决了相对路径问题。 _usablePath
包含真正的路径。"." 路径将是主文件所在的目录。无论如何调用,它都将指向预期的目录。
您可以测试打印new File (<path>).getPath ()
返回内容的函数。
我会避免复杂性,只选择绝对路径。大多数用户执行__dirname + '../相对路径'反正。(至少我是这样做的)。
相关文章:
- 节点模块依赖关系
- 如何引用HTML中节点模块中的js文件
- 未定义应为节点模块的对象
- 如何在客户端javascript中需要节点模块
- 如何在节点模块中从命令行运行函数
- 将节点模块添加到gitignore
- 使用Q节点模块时,Bluemix node.js应用程序部署失败
- 使用document.cookie将客户端javascript转换为节点模块
- 查找与锁定和更新调度相关的一个或两个节点模块
- 节点模块的可能结构
- 节点模块对象范围:在所有函数之间共享一个对象
- 有没有一种方法可以使用javascript和节点模块(oracledb)将csv导入oracle数据库
- 单元测试节点模块与mocha,模块变量行为怪异
- 要安装依赖项的自定义节点模块
- Node.js如何将链接标记解析为节点模块
- 如何公开JS节点模块
- 如何访问节点模块中具有相对路径的文件
- 节点模块和常规javascript文件之间的区别是什么
- Npm.require可以'找不到节点模块
- 将参数传递给基于类的节点模块