我想用指挥官阅读文件:
#!/usr/bin/env node
var fs = require('fs')
var program = require('commander')
program
.version('0.0.1')
.usage('<keywords>')
.parse(process.argv)
if(!program.args.length) {
program.help()
} else {
var filename = program.args
console.log('keys: ' + filename)
fs.readFile(filename, 'utf8', function(err, data) {
if (err) throw err
console.log(data)
})
}
$ ./m2k.js test.txt
但是,我收到了这个错误:
fs.js:430
binding.open(pathModule._makeLong(path),
^
TypeError: path must be a string
我做错了什么?
(我在与test.txt
相同的文件夹中有一个名为m2k.js
的文件。)
答案 0 :(得分:6)
如果您打印program.args
或program.args
本身的类型,您将知道它是一个数组。
console.log(Object.prototype.toString.call(program.args), program.args);
// [object Array] [ 'test.txt' ]
因此,您需要像这样使用正确的索引
var filename = program.args[0];
我认为console.log('keys: ' + filename)
的结果对你没什么帮助。这是因为当你使用+
运算符时,它会尝试将filename
对象转换为字符串,并且转换为字符串的String数组通常只有逗号分隔的字符串。您可以像这样检查
console.log(['a'].toString(), ['a', 'b'].toString());
// a a,b
答案 1 :(得分:1)
您的filename
实际上是传递给您的应用程序的所有参数的数组。
在代码中添加console.log(program.args)
以查看其内容。
答案 2 :(得分:0)
var filename = program.args;
文件名的类型是字符串对象而不是字符串文字,因为
typeof filename === 'object' // true
typeod filename === 'string' // false
只需执行此操作即可解决该问题:
var filename = String(program.args);
,因为
new String(arg); //creates a new instance of the String object
和
process.argv // is an array of String objects not literals
,而
String(arg); // tries to turn all objects into a string literal