手动构建URL有任何风险吗?

时间:2017-06-01 14:46:24

标签: node.js path

在node.js中,可以使用标准path lib创建文件路径,例如:

const path = require('path');
const myPath = path.join('directory', 'file');

是否存在手动构建路径的风险?例如:

const myPath = 'directory/file';

我猜它应该没问题,因为:

  • 对此没有具体的in the docs
  • 我从未使用过不接受/作为路径分隔符的操作系统(甚至是Windows)。

2 个答案:

答案 0 :(得分:0)

当您的整个路径是静态的时,就像在myPath = 'directory/file'示例中一样,我知道没有明显的优势。

但是,如果您正在动态构建路径,path.join等必不可少。

一个重要原因是,与字符串连接不同,path.join等人会在其中一个参数不是字符串时阻止意外行为。

在JavaScript中,与undefined值相关的错误很常见。假设您的应用中有一些代码在登录后将用户重定向到他们的个人资料:

if (success) {
  res.redirect(`/users/${params.username}`);
}

看起来很棒,对吗?没那么快。事实证明,username属性实际上是params.userName,因此您将每个用户重定向到/users/undefined。不会抛出任何错误,并且您的单元测试不会检查重定向URL,因此会部署此错误。

如果您这样做了:

res.redirect(path.join('/users', params.username));

...它会立即抛出ArgumentError错误,你的单元测试会失败,而且bug永远不会被部署。

这是一个天真的例子吗?是。检查undefined会很容易吗?是。但是当你养成使用path.join的习惯时,你不必担心这一点。您知道,至少,您将永远不会意外地在路径中使用undefinednull123

在服务器端更重要。假设您有一个处理文件上传的应用程序,并且您希望用户的上传进入目录,并使用其用户名作为其名称:

fs.mkdir(`images/${params.username}`, err => {
  if (err) { throw new Error('Oops!'); }
  fs.writeFile(`images/${params.username}/${params.filename}`, params.filedata, /* ... */);
});

现在,您已将每个用户的上传内容写入images/undefined。在有人注意到这个错误之前,可能需要很长时间(在商业方面)。

答案 1 :(得分:-1)

不是我的观点,一旦我babel的重度用户使用导入,我实际上经常使用它。