我正在使用一个简单的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时才会打印错误,这对我来说没有意义,每次运行脚本时我都应该得到警告吗?
1条答案
按热度按时间s3fp2yjn1#
我也遇到了同样的问题。唯一的区别是我试图在AWS Lambda函数中运行我的代码。
如果您没有在无服务器服务中运行它,请尝试以下控制台命令
编辑:
你可能需要恢复到commonjs风格的'require'风格的导入。这似乎解决了我在AWS Lambda中的问题。不过,请记住在执行此操作之前从package.json中删除“type”:“模块