NodeJS 获得不一致的实验警告

js81xvg6  于 6个月前  发布在  Node.js
关注(0)|答案(1)|浏览(74)

我正在使用一个简单的Node-js CLI工具。在这个工具中,第一行导入package.json,这样CLI工具就可以获取当前版本。我99%确定这一行是我得到的错误的原因:

(node:3197) ExperimentalWarning: Importing JSON modules is an experimental feature. This feature could change at any time
    at emitExperimentalWarning (node:internal/util:225:11)
    at ESMLoader.jsonStrategy (node:internal/modules/esm/translators:268:3)
    at ESMLoader.moduleProvider (node:internal/modules/esm/loader:361:14)

字符串
这是由这条线引起的(我假设):

import pkg from '../package.json' assert {type:'json'};


奇怪的是,我并不是每次都收到这个警告。如果警告是由我的脚本顶部的一行引起的,你会认为这个错误会在脚本每次运行时打印出来,但是我只有在通过命令行传递多个参数时才会收到这个错误。
下面是我的代码:

#!/usr/bin/env node
import Logger from "../log.js";
let Log = new Logger();
import pkg from '../package.json' assert {type:'json'};

let man = "[...] ";

let flags = [
    {
        "flag" : "-l",
        "name" : "--level",
        "tag" : "level",
        "expectValue" : true
    },
    {
        "flag" : "-v",
        "name" : "--version",
        "tag" : "version",
        "expectValue": false
    }
]

let pargs = {}      // Contains all arguments once parsed
let toSkip = [0,1]; // Tracks IDs of args to ignore
let data = {};
let message = '';

let argRegex = /-+[A-Za-z]/ // Regex used to match command-line arguments ex. "-l"
let kvRegex = /[A-Za-z0-9]*=[A-Za-z0-9]*/ // Matches key=value pairs

if (process.argv.length === 2) {
    console.log(man)
    process.exit(0)
} else if (process.argv.length === 3) {
    if (process.argv[2] === '-v' || process.argv[2] === '--version') {
        console.log(pkg.version);
        process.exit(0);
    }
    Log.log(process.argv[2]);
    process.exit(0);
} else {
    process.argv.forEach((arg, index) => {
        if (!toSkip.includes(index)) {
            if (argRegex.test(arg)) {
                parseArgument(arg, index);
            } else if (kvRegex.test(arg)) {
                data[arg.split('=')[0]] = arg.split('=')[1];
            } else {
                message = arg;
            }
        }
    });
    Log.log(message, pargs.level, data);
}

function parseArgument(arg, index) {
    flags.forEach(flag => {
        if (arg === flag.name || arg === flag.flag) {
            if (flag.tag === 'version') {
                console.log(pkg.version)
                process.exit(0);
            }
            if (flag.expectValue) {
                // flag expects a value, ensure there are enough arguments
                if (index < process.argv.length - 1) {
                    pargs[flag.tag] = process.argv[index + 1];
                    toSkip.push(index + 1);
                } else {
                    console.log("Not enough parameters.")
                    process.exit(9); //Invalid Argument exit code s
                }
            } else {
                // Flag doesn't expect value, so just store the fact that
                // it was passed
                pargs[flag.tag] = true;
            }
        }
    });
}


只有当参数长度不是2或3时才会打印错误,这对我来说没有意义,每次运行脚本时我都应该得到警告吗?

s3fp2yjn

s3fp2yjn1#

我也遇到了同样的问题。唯一的区别是我试图在AWS Lambda函数中运行我的代码。
如果您没有在无服务器服务中运行它,请尝试以下控制台命令

  • node --experimental-json-modules index.js

编辑:
你可能需要恢复到commonjs风格的'require'风格的导入。这似乎解决了我在AWS Lambda中的问题。不过,请记住在执行此操作之前从package.json中删除“type”:“模块

相关问题