Node.js中的path.join方法会移除开头的点号

11

我带着一个工作项目回到家,计划在个人电脑上进行调试。我安装了所有东西,使用相同的环境(Node v0.11.12)等等。启动项目后,我看到一些提示消息,抱怨配置加载器模块无法找到一个文件(该文件实际存在于错误路径下)。

仔细查看错误,我意识到问题出在path.join()。那么这个问题出现在哪里呢?

path.join('./foo/bar');
// 'foo/bar'

这不太好。为什么path.join会删除前导点?

** 注意 **

上面只是一个例子。程序使用类似于此函数的功能。

var configFile = require(path.join(modulePath, 'conf', file));

例如,其中modulePath是相对于当前工作目录的(即./app/module/


1
那应该仍然有效。你应该添加一些控制台日志来查看你实际尝试“require”的路径。 - Joe
@Joe,我已经尝试过了,这就是我问问题的原因。在我的工作电脑上它可以很好地运行,但是在我家使用(我认为)完全相同设置的电脑上却不能。这个问题已经超出了调试的范畴,更多是关于“为什么会这样”的问题。 - Yanick Rochon
一个路径中的 . 表示当前路径。因此,当作为本地文件路径解析时,./foo/./bar 通常应该等同于规范形式 foo/bar,因为非绝对路径隐含相对路径。哪些路径可以正常工作,哪些路径不能在 configFile 中使用?(也就是说,提供工作/失败情况的输入和输出。) - user2864740
2
@user2864740,可行的解决方案是手动使用process.cwd()解析路径并传递绝对路径到require。顺便说一下,如果前导点还在,它仍然有效。让我重新表述一下,require('./foo/bar');有效,但require('foo/bar');无效。但所有这些都不是问题的直接部分。我期望path.join() "连接"路径,而不以任何方式解决它。 - Yanick Rochon
1
因为 foo/bar./foo/././././bar/. 的规范形式 - 而 path.join 返回规范形式。"点路径组件" 在前面(而不是其他地方)的事实并不重要。 - user2864740
显示剩余5条评论
1个回答

3

这是正确的行为,并在Path.join文档中有记录:

将所有参数连接在一起并规范化结果路径。

之所以正确,是因为foo/bar./foo/bar的规范(标准)形式,就像它是./foo/././bar/.foo/baz/../bar的规范形式一样。

require('./foo/bar')require('foo/bar')之间的差异以及由此导致的任何问题应在不使用path.join的不同问题中具体解决。)


你有没有想法为什么我在工作几周以来一直运行得很顺利,但现在突然出现了这个错误?:) - Yanick Rochon
@YanickRochon 不知道。有任何源代码更改或版本更新吗? - user2864740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接