Узел.js-получение текущего имени файла
Как получить текущее имя файла, имя функции и номер строки?
Я хочу использовать его для входа/отладки, что эквивалентно __FILE__
,__LINE__
в c
9 ответов:
узел.js предоставляет стандартный API для этого:путь.
тогда легко получить имя текущего скрипта:
var path = require('path'); var scriptName = path.basename(__filename);
в модуле вы можете выполнять следующие действия, чтобы получить полный путь с именем
this.filename; module.filename; __filename;
Если вы хотите просто имя без пути и расширения, вы можете сделать что-то подобное.
module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);
чтобы получить только имя файла. Нет дополнительного модуля просто:
// abc.js console.log(__filename.slice(__dirname.length + 1)); // abc console.log(__filename.slice(__dirname.length + 1, -3));
'use strict'; const scriptName = __filename.split(/[\/]/).pop();
объяснение
console.log(__filename); // 'F:\__Storage__\Workspace\StackOverflow\yourScript.js' const parts = __filename.split(/[\/]/); console.log(parts); /* * [ 'F:', * '__Storage__', * 'Workspace', * 'StackOverflow', * 'yourScript.js' ] * **/
здесь мы используем сплит (первый документировано в узле.с JS версии v0.1.25), потому что он обрабатывает все угловые случаи, о которых вы не хотите знать, как имена файлов с косыми чертами внутри (например, файл с именем "foo\bar" в unix). Смотрите
path
ответ выше.
Ну, я хотел использовать имя файла в качестве тега для регистратора, так что самый прямой и то, что я хотел это:
__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))
я использую следующее регулярное выражение:
([^\/]+?)(?:\.[^\.\/]*)?$
работает с конца строки
$
, есть необязательный незахватывающие группа для возможного расширения(?:\.[^\.\/]*)?
предшествует нежадный захват группы для чего-либо, кроме разделителей каталогов\/
. Группа имен файлов -нежадный разрешать следующие незахватывающие группа для удаления возможного расширения.An реализация будет ссылаться на первую и единственную группу захвата
[1]
:var name = __filename.match(/([^\/]+?)(?:\.[^\.\/]*)?$/)[1];
группа захвата имени файла с не-жадным / ленивым спецификатором
([^\/]+?) ^ lazy
опционная группа расширения, который нужно сбросить поставленный на якорь
$
до конца строки(?:\.[^\.\/]*)?$ ^^ ^ non-capture optional
var regex = /([^\/]+?)(?:\.[^\.\/]*)?$/; [ ["abc.js", "abc"], ["/tmp/test/../lib/stuff.js", "stuff"], ["c:\temp\test\..\lib\stuff.js", "stuff"], ["./abc/def.js", "def"], [".\abc\win.js", "win"], ["./lib/my-module.js", "my-module"], [".\lib/my-dotless", "my-dotless"], ["..///lib/..\\.//..dots&seps..", "..dots&seps."], ["trailing-dots...js", "trailing-dots.."] ].forEach( test => { var name = test[0].match(regex)[1]; var result = test[0] + " => " + test[1] + " # " + (name === test[1] ? "Passed" : "Failed"); console.log(result); });
оценка любезно https://regex101.com