繁体   English   中英

TypeError:path必须是带有commander的字符串

[英]TypeError: path must be a string with commander

我想用指挥官读取一个文件:

#!/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

我究竟做错了什么?

(我在m2k.js文件夹中有一个名为test.txt的文件。)

如果你打印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)的结果console.log('keys: ' + filename)对你帮助不大。 这是因为当你使用+运算符时,它会尝试将filename对象转换为字符串,并且转换为字符串的String数组通常只有逗号分隔的字符串。 你可以这样检查一下

console.log(['a'].toString(), ['a', 'b'].toString());
// a a,b

您的filename实际上是传递给您的应用程序的所有参数的数组。

console.log(program.args)添加到您的代码中以查看其内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM