javascript - 类型错误 : path must be a string with commander

标签 javascript node.js command-line-interface

我想和指挥官一起读一个文件:

#!/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) 的结果对您帮助不大。这是因为当您使用 + 运算符时,它会尝试将 filename 对象转换为字符串,而转换为字符串的 String 数组通常只有逗号分隔的字符串。你可以这样检查

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

关于javascript - 类型错误 : path must be a string with commander,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721585/

相关文章:

angularjs - 使用 Redis 键值存储的实时 Web 应用程序

javascript - Commander-js 的强制参数

bash - `echo $?` 在 bash 中是什么意思?

swift - 在 Swift 中终止 macOS 命令行工具的子进程

javascript - Facebook Javascript SDK 在流发布期间导致 IE8 上的 XSS 阻止

Javascript/JQuery POST "url"未定义(未定义)

javascript - Ammap.js 4 - 将 map 设置为半静态 View 地球 + 将 mapObject 设置为中心

javascript - 如何使用图像标签

arrays - 如何在 Node.js 中通过 Mongoose 使用点(.) 进行查询以及如何添加空数组

node.js - npm 脚本使用哈希开始生产构建