【问题标题】:Is there any risk to building URLs manually?手动构建 URL 有风险吗?
【发布时间】:2017-06-01 14:46:23
【问题描述】:

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

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

手动构建路径是否有风险?例如:

const myPath = 'directory/file';

我猜应该没问题,因为:

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

【问题讨论】:

    标签: node.js path


    【解决方案1】:

    当您的整个路径是静态的时,例如在您的 myPath = 'directory/file' 示例中,据我所知,没有明显的优势。

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

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

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

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

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

    如果你这样做了:

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

    ...它会立即引发 ArgumentError 错误,您的单元测试将失败,并且永远不会部署错误。

    这是一个幼稚的例子吗?是的。检查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。可能需要很长时间(在商业术语中)才会有人注意到这个错误。

    【讨论】:

      【解决方案2】:

      在我看来不是这样,一旦我是 babel 的重度用户使用 import 时,我实际上经常使用它。

      【讨论】:

        猜你喜欢
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 2019-08-09
        • 2017-09-24
        • 2010-11-24
        • 2021-11-16
        • 2011-09-14
        相关资源
        最近更新 更多