你需要在 node.js 中使用 path.join 吗?

Posted

技术标签:

【中文标题】你需要在 node.js 中使用 path.join 吗?【英文标题】:Do you need to use path.join in node.js? 【发布时间】:2012-04-03 03:15:00 【问题描述】:

众所周知,Windows 使用反斜杠执行路径,而 Unix 使用正斜杠执行路径。 node.js 提供path.join() 以始终使用正确的斜杠。因此,例如,不要只编写 Unix 'a/b/c',而是改为使用 path.join('a','b','c')

但是,尽管存在这种差异,但如果您不规范化您的路径(例如使用 path.join)并且只编写像 a/b/c node.js 这样的路径,那么在 Windows 上运行您的脚本似乎没有问题。

那么写path.join('a','b','c') 而不是'a/b/c' 有什么好处吗?无论平台如何,两者似乎都可以工作......

【问题讨论】:

【参考方案1】:

我使用path.join 来确保文件夹分隔符位于正确的位置,而不一定要确保它使用正斜杠和反斜杠。例如:

path.join("/var/www", "test")

会在 www 和 test /var/www/test 之间正确插入分隔符

【讨论】:

我不明白这一点。如果变量中有这些脚本,为什么不手动添加斜线? 我也很难理解这个答案。看不到任何值。 因为我并不总是确定我从其他来源获得的路径值是否会有斜杠。我上面的例子是人为的。通常这些路径不是硬编码的,而是从其他配置文件、用户输入、库等中提取的。 @TimothyStrimple ~ 使用path.join 的好地方将在您的其他答案***.com/questions/9027648/… 中。这个答案让我想到了另一个你自己回答的问题:) 我也对这个答案持怀疑态度,直到 5 分钟后我的代码在 return baseDir + relativePath + filename; 上爆炸了。我立即将其替换为return path.join(baseDir, relativePath, filename);。确实很有帮助!【参考方案2】:

path.join 将处理不必要的分隔符,如果给定路径来自未知来源(例如,用户输入、第 3 方 API 等),可能会出现这种情况。

所以path.join('a/','b')path.join('a/','/b')path.join('a','b')path.join('a','/b') 都会给出a/b

如果不使用它,您通常会对所连接路径的开始和结束产生预期,因为知道它们只有一个斜线或一个斜线。

【讨论】:

这听起来有点用,但接收来自未知来源的任意未经检查的路径听起来像是一个很大的安全问题。这不是经常做的事情。【参考方案3】:

简答:

所有fs.* 函数(例如fs.open 等)都会为您处理路径名。因此,您无需自己使用path.join 并使您的代码难以辨认。

长答案:

所有fs.* 函数都调用path._makeLong(path),而path.resolve(path) 又调用path.resolve(path),它具有适用于Windows 的特殊正则表达式,其中考虑了反斜杠\ 或正斜杠/。你可以自己查看他们的源代码:

https://github.com/joyent/node/blob/061f2075cf81017cdb40de80533ba18746743c94/lib/fs.js#L97 https://github.com/joyent/node/blob/061f2075cf81017cdb40de80533ba18746743c94/lib/path.js#L437 https://github.com/joyent/node/blob/061f2075cf81017cdb40de80533ba18746743c94/lib/path.js#L85

【讨论】:

【参考方案4】:

Windows 文件系统使用正斜杠或反斜杠作为路径分隔符都没有问题(早在 DOS 时代就一直如此)。唯一真正的问题是 Windows 命令行处理器(或更具体地说,Windows 原生命令行实用程序)倾向于将正斜杠解释为选项说明符而不是路径组件。因此,如果您需要将路径传递给作为子进程运行的 Windows 命令,则需要使用反斜杠路径。此外,返回路径的 Windows API 调用(以及来自调用 Windows API 的高级语言的方法)将使用反斜杠,因此即使您没有将它们传递给子进程,也需要对其进行规范化。

【讨论】:

正斜杠也会中断 UNC 路径。 这个答案没有说明为什么在典型的 Node.js 应用程序中使用它。或者也许只是我没有得到它。虽然很有趣。

以上是关于你需要在 node.js 中使用 path.join 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中使用某些 es6 方法时是不是需要使用 strict [重复]

使用 Node.js 在内存中缓冲整个文件

在 Node.js 中部署 angularjs 应用程序

使用pkg打包Node.js应用的方法步骤

10个常见的Node.js面试题

在公共 JS 文件中使用 Node.js