【问题标题】:Expanding / Resolving ~ in node.js在 node.js 中扩展/解决 ~
【发布时间】:2014-01-31 09:28:45
【问题描述】:

我是 nodejs 的新手。节点能否解析~(unix主目录)示例~foo,~bar 到 /home/foo, /home/bar

> path.normalize('~mvaidya') '~mvaidya' > path.resolve('~mvaidya') '/home/mvaidya/~mvaidya' >

这个反应是错误的;我希望 ~mvaidya 必须解析为 /home/mvaidya

【问题讨论】:

    标签: node.js path


    【解决方案1】:

    正如QZ Support 所述,您可以在 OSX/Linux 上使用process.env.HOME。这是一个没有依赖关系的简单函数。

    const path = require('path');
    function resolveHome(filepath) {
        if (filepath[0] === '~') {
            return path.join(process.env.HOME, filepath.slice(1));
        }
        return filepath;
    }
    

    【讨论】:

    • 这会错误地将~foo 解析为/home/<current-user>/foo,而技术上它应该解析为/home/foo(至少在zsh 中)。
    • 而不是process.env.HOME,或许应该使用require('os').homedir()
    【解决方案2】:

    之所以不在 Node 中是因为 ~ 扩展是 bash(或 shell)特定的东西。目前尚不清楚如何正确逃避它。详情请见this comment

    有各种库提供此功能,大多数只需几行代码...

    所以你可能想自己做。

    【讨论】:

    • 欣赏背景解释,~ 是一个 bash-thing。
    • os.homedir() 正是我想要的!谢谢!
    【解决方案3】:

    此 NodeJS 库通过异步回调支持此功能。它使用 etc-passswd 库来执行扩展,因此可能无法移植到 Windows 或其他非 Unix/Linux 平台。

    如果您只想为当前用户扩展主页,那么这个更轻量级的 API 可能就是您所需要的。它也是同步的,因此使用起来更简单,并且适用于大多数平台。

    示例:

     expandHomeDir = require('expand-home-dir')
    
     expandHomeDir('~')
     // => /Users/azer
    
     expandHomeDir('~/foo/bar/qux.corge')
     // => /Users/azer/foo/bar/qux.corge
    

    另一个相关的 lib 是 home-dir,它在任何平台上返回用户的主目录:

    https://www.npmjs.org/package/home-dir
    

    【讨论】:

    • 对于那些在 Linux/Unix/Mac 上使用当前主目录的人来说,process.env.HOME 似乎可以很好地代替其他帖子中提到的节点模块解决方案。例如~/somepath 可以是 process.env.HOME + '/somepath',但是警告......它不会解决 ~someuserhome/somepath 的原始问题,因为这需要链接模块解决方案。
    【解决方案4】:

    一个例子:

    const os = require("os");

    "~/Dropbox/sample/music".replace("~", os.homedir)

    【讨论】:

    • 如果你的路径包含 ~ 字符串开头以外的任何地方,这将创建一个不正确的路径
    【解决方案5】:

    我今天只需要它,唯一不那么规避的命令是来自os 的命令。

    $ node
    > os.homedir()
    '/Users/mdesales'
    

    我不确定您的语法是否正确,因为 ~ 已经是当前用户主目录的结果

    【讨论】:

      【解决方案6】:

      这是以前的一些答案的组合,并添加了更多的安全性。

      /**
       * Resolves paths that start with a tilde to the user's home directory.
       *
       * @param  {string} filePath '~/GitHub/Repo/file.png'
       * @return {string}          '/home/bob/GitHub/Repo/file.png'
       */
      function resolveTilde (filePath) {
        const os = require('os');
        if (!filePath || typeof(filePath) !== 'string') {
          return '';
        }
      
        // '~/folder/path' or '~' not '~alias/folder/path'
        if (filePath.startsWith('~/') || filePath === '~') {
          return filePath.replace('~', os.homedir());
        }
      
        return filePath;
      }
      
      • 使用更现代的os.homedir() 而不是process.env.HOME
      • 使用可以从任何地方调用的简单辅助函数。
      • 具有基本类型检查。如果传入的是非字符串而不是返回空字符串,您可能希望默认返回 os.homedir()
      • 验证路径是否以~/ 开头或只是~,以不替换其他别名,例如~stuff/
      • 使用简单的“替换第一个实例”方法,而不是不太直观的.slice(1)

      【讨论】:

        【解决方案7】:

        今天我用https://github.com/sindresorhus/untildify

        我在 OSX 上运行,运行良好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多