如何在Node.js中获取脚本的路径?
我知道有流程。Cwd,但它只引用调用脚本的目录,而不是脚本本身。例如,假设我在/home/kyle/目录下,然后运行以下命令:
node /home/kyle/some/dir/file.js
如果我调用process.cwd(),我会得到/home/kyle/,而不是/home/kyle/some/dir/。有办法得到那个目录吗?
如何在Node.js中获取脚本的路径?
我知道有流程。Cwd,但它只引用调用脚本的目录,而不是脚本本身。例如,假设我在/home/kyle/目录下,然后运行以下命令:
node /home/kyle/some/dir/file.js
如果我调用process.cwd(),我会得到/home/kyle/,而不是/home/kyle/some/dir/。有办法得到那个目录吗?
当前回答
每个Node.js程序在其环境中都有一些全局变量,这些变量表示关于进程的一些信息,其中一个是__dirname。
其他回答
使用__dirname ! !
__dirname
当前模块的目录名。这与__filename的path.dirname()相同。
例如:在/Users/mjr中运行node Example .js
console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr
https://nodejs.org/api/modules.html#modules_dirname
对于esmodule,你会想要使用: import.meta.url
这个命令返回当前目录:
var currentPath = process.cwd();
例如,使用路径读取文件:
var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data)
{
if(err)
console.log(err)
else
console.log(data.toString());
});
使用path模块的basename方法:
var path = require('path');
var filename = path.basename(__filename);
console.log(filename);
下面是上面例子的文档。
正如Dan指出的,Node正在处理带有“——experimental-modules”标志的ECMAScript模块。节点12仍然支持前面提到的__dirname和__filename。
如果您正在使用——experimental-modules标志,还有另一种方法。
另一种方法是获取当前ES模块的路径:
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(new URL(import.meta.url));
对于包含当前模块的目录:
import { fileURLToPath } from 'url';
import path from 'path';
const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url)));
每个Node.js程序在其环境中都有一些全局变量,这些变量表示关于进程的一些信息,其中一个是__dirname。
如果你想在shell脚本中使用类似$0的东西,试试这个:
var path = require('path');
var command = getCurrentScriptPath();
console.log(`Usage: ${command} <foo> <bar>`);
function getCurrentScriptPath () {
// Relative path from current working directory to the location of this script
var pathToScript = path.relative(process.cwd(), __filename);
// Check if current working dir is the same as the script
if (process.cwd() === __dirname) {
// E.g. "./foobar.js"
return '.' + path.sep + pathToScript;
} else {
// E.g. "foo/bar/baz.js"
return pathToScript;
}
}