如何从接收到的nodejs spawn中读取数据

时间:2018-05-23 23:33:14

标签: node.js stream child-process

我对nodejs程序有一个小问题。我尝试使用child_process模块,但以下代码只会在我从nfc读卡器中取出卡后触发data事件。

问题是我需要的输出在卡被移除之前可用。

例如,如果我将我的卡放在阅读器上,则需要半秒钟来打印一些包含卡片UID的行。

然后,如果我不发布该卡,程序nfc-poll仍将有效,但不会输出任何内容。一旦我从读卡器中取出我的卡,它就会输出一些东西,然后关闭缓冲区。这是发出事件data的时间。

我想要的是能够尽快读取每个字节以尽快发出卡片ID。

function NFCReader() {
  this.reader = new events.EventEmitter()
  this.start_process()
}

NFCReader.prototype = {
  start_process: function () {
    this._process = cp.spawn('nfc-poll', [], {})
    this._process.on('close', this.restart_process.bind(this))
    //this._process.stdout.on('data', this.handle_data.bind(this))
    this._process.stdout.readableFlowing = true
    this._process.stdout.on('data', this.handle_data.bind(this))
    this._process.stderr.on('data', this.handle_error.bind(this))
  },

  handle_data: function (data) {
    var _data = data.toString()
    var uid_lines = _data
      .split('\n')
      .filter(function (line) {return line.search('UID') >= 0})

    if (uid_lines.length != 1) {
      this.reader.emit('error', 'Multiple UID found')
      return
    }

    var card_id = uid_lines[0]
      .trim()
      .split(':')[1].trim()
      .replace(/[ ]+/g, ':')

    this.reader.emit('card', card_id)
  },
}

我尝试使用烟斗,但它似乎没有帮助。

1 个答案:

答案 0 :(得分:0)

这是我release tools repo的一个runStream函数:

__git_complete grb _git_rebase

您可以复制它,或者如果您想要等待几天,我可以将其作为单独的模块发布。我想虽然可能已经有类似的东西......