Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Node.js获取当前脚本的路径?_Node.js - Fatal编程技术网

如何使用Node.js获取当前脚本的路径?

如何使用Node.js获取当前脚本的路径?,node.js,Node.js,如何获取Node.js中脚本的路径 我知道有process.cwd,但它只指调用脚本的目录,而不是脚本本身。例如,假设我在/home/kyle/中,我运行以下命令: node /home/kyle/some/dir/file.js 如果调用process.cwd(),则得到的是/home/kyle/,而不是/home/kyle/some/dir/。有办法得到那个目录吗?我在再次查看文档后找到了它。我要找的是和模块级别的变量 \u filename是当前模块的文件名。这是当前模块文件的解析绝对

如何获取Node.js中脚本的路径

我知道有
process.cwd
,但它只指调用脚本的目录,而不是脚本本身。例如,假设我在
/home/kyle/
中,我运行以下命令:

node /home/kyle/some/dir/file.js

如果调用
process.cwd()
,则得到的是
/home/kyle/
,而不是
/home/kyle/some/dir/
。有办法得到那个目录吗?

我在再次查看文档后找到了它。我要找的是和模块级别的变量

  • \u filename
    是当前模块的文件名。这是当前模块文件的解析绝对路径。(例如:
    /home/kyle/some/dir/file.js
  • \uuu dirname
    是当前模块的目录名。(例如:
    /home/kyle/some/dir

  • 所以基本上你可以这样做:

    fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
    
    使用resolve()而不是与“/”或“\”连接,否则会遇到跨平台问题

    注意:_dirname是模块或包含脚本的本地路径。如果您正在编写一个需要知道主脚本路径的插件,它是:

    require.main.filename
    
    或者,仅获取文件夹名称:

    require('path').dirname(require.main.filename)
    

    当涉及到主脚本时,它非常简单:

    process.argv[1]
    
    从:

    进程argv 包含命令行参数的数组。第一个元素是“node”,第二个元素是JavaScript文件的路径。接下来的元素将是任何其他命令行参数


    如果需要知道模块文件的路径,请使用。

    每个Node.js程序的环境中都有一些全局变量,它表示有关进程的一些信息,其中一个是
    \uu dirname

    您可以使用process.env.PWD获取当前应用程序文件夹路径。

    此命令返回当前目录:

    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());
    });
    

    我知道这是一个很老的问题,我最初回答的问题被标记为重复的,直接在这里,但我遇到了一个问题,试图让jasmine记者工作,我不喜欢为了工作而不得不降级的想法。我发现jasmine reporters没有正确解析保存路径,实际上是将reports文件夹输出放在jasmine reporters目录中,而不是我运行gulp的根目录中。为了正确地工作,我最终使用了process.env.INIT_CWD来获取初始的当前工作目录,该目录应该是运行gulp的目录。希望这对别人有帮助

    var reporters = require('jasmine-reporters');
    var junitReporter = new reporters.JUnitXmlReporter({
      savePath: process.env.INIT_CWD + '/report/e2e/',
      consolidateAll: true,
      captureStdout: true
     });
    

    如果希望在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;
        }
    }
    
    var path=require('path');
    var命令=getCurrentScriptPath();
    log(`Usage:${command}`);
    函数getCurrentScriptPath(){
    //从当前工作目录到此脚本位置的相对路径
    var pathToScript=path.relative(process.cwd(),u文件名);
    //检查当前工作目录是否与脚本相同
    if(process.cwd()==\uu dirname){
    //例如“/foobar.js”
    返回“.”+path.sep+pathToScript;
    }否则{
    //例如“foo/bar/baz.js”
    返回路径脚本;
    }
    }
    
    如果您使用
    pkg
    打包应用程序,您会发现以下表达式很有用:

    appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
    
    • process.pkg
      告知应用程序是否由
      pkg
      打包

    • process.execPath
      保存可执行文件的完整路径,该路径为
      /usr/bin/node
      或类似路径,用于直接调用脚本(
      node test.js
      )或打包的应用程序

    • require.main.filename
      保存主脚本的完整路径,但当节点以交互模式运行时,该路径为空

    • \uuuDirName
      保存当前脚本的完整路径,因此我不使用它(尽管它可能是OP要求的;那么最好使用
      appDirectory=process.pkg?require('path').dirname(process.execPath):(\uuDirName | require('path').dirname(process.argv[0]))
      注意,在交互模式下,
      \u dirname
      为空

    • 对于交互模式,使用
      process.argv[0]
      获取节点可执行文件的路径,或使用
      process.cwd()
      获取当前目录


    使用dirname!!

    __dirname
    
    当前模块的目录名。这与
    \u文件名的path.dirname()相同

    示例:从/Users/mjr运行node Example.js

    console.log(__dirname);
    // Prints: /Users/mjr
    console.log(path.dirname(__filename));
    // Prints: /Users/mjr
    

    对于您希望使用的ESModules:
    import.meta.url

    Node.js 10支持,其中

    然后,要获得一个,必须使用:

    import { fileURLToPath } from 'url';
    
    const __filename = fileURLToPath(import.meta.url);
    
    对于包含当前模块的目录:

    import { dirname } from 'path';
    import { fileURLToPath } from 'url';
    
    const __dirname = dirname(fileURLToPath(import.meta.url));
    
    import path from 'path';
    
    const __dirname = path.dirname(new URL(import.meta.url).pathname);
    

    使用
    path
    模块的
    basename
    方法:

    var path = require('path');
    var filename = path.basename(__filename);
    console.log(filename);
    
    是上述示例所引用的文档

    正如Dan指出的,Node正在使用“-experimentalmodules”标志进行工作


    如果您使用的是
    --experimental modules
    标志,则存在一个

    另一种方法是获得:

    对于包含当前模块的目录:

    import { dirname } from 'path';
    import { fileURLToPath } from 'url';
    
    const __dirname = dirname(fileURLToPath(import.meta.url));
    
    import path from 'path';
    
    const __dirname = path.dirname(new URL(import.meta.url).pathname);
    

    包含要导出的模块的任何文件夹中的index.js

    const entries = {};
    for (const aFile of require('fs').readdirSync(__dirname, { withFileTypes: true }).filter(ent => ent.isFile() && ent.name !== 'index.js')) {
      const [ name, suffix ] = aFile.name.split('.');
      entries[name] = require(`./${aFile.name}`);
    }
    
    module.exports = entries;
    

    这将找到当前目录根目录中的所有文件,需要并导出与文件名stem具有相同导出名称的每个文件。

    如果您的目标只是解析json文件并与之交互,您通常可以通过
    var settings=require('./settings.json')更轻松地完成此操作
    。当然,它是同步的fs IO,所以不要在运行时执行,但在启动时就可以了,一旦加载,它就会被缓存。@Marc谢谢!有一段时间我一直在绕开这样一个事实:每个模块都有一个u dirname。我的库中有一个嵌套结构,需要在几个地方知道我的应用程序的根。很高兴我知道