在node.js中扩展/解析〜

for*_*dya 41 path node.js

我是nodejs的新手.可以节点解析〜(unix主目录)示例~foo,~bar到/ home/foo,/ home/bar

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

这种反应是错误的; 我希望~mvaidya必须解决/ home/mvaidya

Pj *_*etz 26

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

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

  • 这错误地将`~foo`解析为`/ home/<current-user>/foo`,技术上它应解析为`/ home/foo`(至少在zsh中). (4认同)
  • 而不是`process.env.HOME`,也许应该使用`require('os').homedir()`? (4认同)

wir*_*res 15

这不是在Node中的原因是因为~扩展是一个bash(或shell)特定的东西.目前还不清楚如何正确逃脱它.有关详情,请参阅此评论.

有各种各样的库提供这个,大多数只是几行代码......

所以你可能想自己这样做.

  • 感谢背景说明,`〜`是个bash-thing。 (2认同)

Ton*_*gan 12

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

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

例子:

 expandHomeDir = require('expand-home-dir')

 expandHomeDir('~')
 // => /Users/azer

 expandHomeDir('~/foo/bar/qux.corge')
 // => /Users/azer/foo/bar/qux.corge
Run Code Online (Sandbox Code Playgroud)

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

https://www.npmjs.org/package/home-dir
Run Code Online (Sandbox Code Playgroud)

  • 对于那些使用Linux/Unix/Mac上当前主目录的人来说,`process.env.HOME`似乎可以很好地代替其他帖子中提到的节点模块解决方案.例如`〜/ somepath`可以`process.env.HOME +"/ somepath'`,但警告......它不会解决原来的问题`〜someuserhome/somepath`因为这将需要连接的模块解决方案. (8认同)

Bai*_*ong 11

一个例子:

const os = require("os");

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

  • 如果您的路径包含 ~ 字符串开头以外的任何位置,这将创建不正确的路径 (5认同)

Jar*_*eda 11

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

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)
  • 是一个可以从任何地方调用的简单辅助函数。
  • 使用更现代的os.homedir()而不是process.env.HOME.
  • 具有基本的类型检查。os.homedir()如果传入非字符串,您可能希望默认返回而不是返回空字符串。
  • 验证路径以~/或 开头~,而不是替换其他别名,例如~stuff/.
  • 使用简单的“替换第一个实例”方法,而不是不太直观的方法.slice(1)


Mar*_*les 5

我今天刚需要它,唯一不太回避的命令是os.

$ node
> os.homedir()
'/Users/mdesales'
Run Code Online (Sandbox Code Playgroud)

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