带有正斜杠的窗口中的Nodejs绝对路径

Posted

技术标签:

【中文标题】带有正斜杠的窗口中的Nodejs绝对路径【英文标题】:Nodejs absolute paths in windows with forward slash 【发布时间】:2016-03-23 14:24:28 【问题描述】:

我可以在 nodejs 的窗口中使用带有正斜杠的绝对路径吗?我正在使用这样的东西:

global.__base = __dirname + '/';
var Article = require(__base + 'app/models/article');

但在 Windows 上构建失败,因为它需要 C:\Something\Something/apps/models/article 之类的东西。我正在使用 webpack。那么如何规避这个问题,使要求保持不变,即__base + 'app/models/src'

【问题讨论】:

nodejs.org/api/path.html @Amadan 正如我所说,我不想改变我需要模块的方式 如果您不想更改代码,您希望我们做什么? 我在谈论 global.__base = __dirname + '/'; 周围的另一种方式。我愿意改变它,因为这种情况在代码中只发生一次 您仍在将/ 固定为app/models/article 中的分隔符。我不知道C:\Something\Something/apps/models/article 是否适用于 Windows(我从未为它开发过),但 path.join(__dirname, 'app', 'models', 'article') 可以。 【参考方案1】:

我知道现在回答有点晚,但我认为我的回答会对一些访客有所帮助。

Node.js 中,您只需分别使用__filename__dirname 变量即可轻松获取当前运行的文件名及其目录。

为了根据您的系统更正正斜杠和反斜杠,您可以使用 Node.jspath 模块

var path = require('path');

就像这里是一个混乱的路径,如果我想在我的服务器上使用它,我希望它是正确的。 path 模块在这里为您做所有事情

var randomPath = "桌面//我的文件夹/\myfile.txt";

var correctedPath = path.normalize(randomPath); //that's that

console.log(correctedPath);
desktop/my folder/myfile.txt

如果你想要一个文件的绝对路径,那么你也可以使用path模块的resolve函数

var somePath = "./img.jpg";
var resolvedPath = path.resolve(somePath);

console.log(resolvedPath);
/Users/vikasbansal/Desktop/temp/img.jpg

【讨论】:

@VikasBansat: path.normalize(path.resolve('./')) - 实际上是您建议的方式。但是,这并不能解决 Windows 8 下的问题(至少)。 这根本行不通。反斜杠仍然是反斜杠。【参考方案2】:

现在是 2020 年,距离问题发布还有 5 年,但我希望我的回答对某些人有用。我使用了replace方法,这是我的代码(express js项目):

const viewPath = (path.join(__dirname, '../views/')).replace(/\\/g, '/')

exports.articlesList = function(req, res) 
    res.sendFile(viewPath + 'articlesList.html');
 

【讨论】:

非常适合我将正斜杠路径插入数据库【参考方案3】:

我终于做到了:

var slash = require('slash');
var dirname = __dirname;
if (process.platform === 'win32') dirname = slash(dirname);

global.__base = dirname + '/';

然后要求var Article = require(__base + 'app/models/article');。这使用了 npm 包斜杠(它用路径中的斜杠替换反斜杠并处理更多情况)

【讨论】:

我宁愿推荐使用nodejs.org/api/path.html#path_path_sep,这正是此功能的目的;)并使其成为单线! @Vadorequest 谢谢!以前从未听说过path.sep - 这正是我们所寻找的! 感谢您提醒我这个解决方案存在,我完全忘记了它^^'【参考方案4】:

我建议不要这样做,因为它正在修补节点本身,但是......好吧,你需要的东西没有改变。

(function() 
  "use strict";
  var path = require('path');
  var oldRequire = require;
  require = function(module) 
    var fixedModule = path.join.apply(path, module.split(/\/|\\/));
    oldRequire(fixedModule);
  
)();

【讨论】:

【参考方案5】:

接受的答案实际上并没有回答大多数人来这里的问题。 如果您希望规范化所有路径分隔符(可能用于字符串工作),这就是您所需要的。

所有代码段都将node.js内置模块path导入path变量。 除非另有说明,否则它们的工作变量也存储在不可变变量 str 中。

如果你有一个字符串,这里有一个快速的单行将字符串规范化为正斜杠 (/):

const answer = path.resolve(str).split(path.sep).join("/");

您可以通过替换正斜杠 (/) 来规范化为任何其他分隔符。

如果您只需要路径部分的数组,请使用:

const answer = path.resolve(str).split(path.sep);

一旦你完成了你的字符串工作,使用它来创建一个可以使用的路径:

const answer = path.resolve(str);

从一个数组中,使用这个:

// assume the array is stored in constant variable arr
const answer = path.join(...arr);

【讨论】:

【参考方案6】:

这是我使用的方法,以节省一些处理:

const path = require('path');

// normalize based on the OS
const normalizePath = (value: string): string 
  return path.sep === '\' 
    ? value.replace(/\\/g, '/')
    : value;


console.log('abc/def'); // leaves as is
console.log('abc\def'); // on windows converts to `abc/def`, otherwise leave as is

【讨论】:

【参考方案7】:

使用路径模块

const path = require("path");
var str = "test\test1 (1).txt";
console.log(str.split(path.sep)) // This is only on Windows

【讨论】:

以上是关于带有正斜杠的窗口中的Nodejs绝对路径的主要内容,如果未能解决你的问题,请参考以下文章

头疼的路径问题(相对路径与绝对路径)正斜杠与反斜杠

【JMeter05】参数化之绝对路径&相对路径

绝对路径与相对路径解析

Web应用中相对路径与绝对路径

python绝对路径的表述方式 及 字符串的转义

绝对路径与相对路径