繁体   English   中英

暂停Node.js可读流

[英]Pausing Node.js Readable Stream

我正在使用node-serialport构建条形码扫描应用程序。 我遇到的困难是进行AJAX调用以触发扫描,然后让Express服务器用可读流中的数据响应。

初始化设备:

// Open device port    
var SerialPort = require('serialport');
var port = '/dev/cu.usbmodem1411';
var portObj = new SerialPort(port, (err) => {
 if(err) {
  console.log('Connection error ' + err);
 }
});

//Construct device object
var Scanner = {
  // Trigger Scan
  scan : () => {
    portObj.write(<scan cmd>), (err) => {
      if(err) {
        console.log('Error on scan' + err);
      }
    });
  }
}

我尝试了两种方法,但都没有产生我想要的“扫描读取响应”行为。

首先,我尝试在扫描后立即放置事件侦听器,然后在侦听器中使用回调来响应AJAX请求。 通过这种方法,我会收到“发送标头后无法设置标头”错误。 据我了解,Node抛出此错误是因为res.send被多次调用。

第一种方法-将响应作为侦听器中的回调:

app.get('/dashboard', (req, res) => {
 Scanner.scan(); //fire scanner
 portObj.on('data', (data) => {
  res.send(data); //'Can't set headers after they are sent' error'
 });
}

在第二种方法中,我将扫描数据存储到局部变量('scanned_data')中,并将响应移到侦听器块之外。 这种方法的问题在于,res.send在扫描的数据被捕获到本地变量之前执行,因此显示为“ undefined”。 有趣的是,每次扫描在侦听器块中捕获的scand_data似乎成倍增加。

第二种方法-听众之外的回应:

app.get('/dashboard', (req, res) => {
  var scanned_data; //declare variable outside listener block
  Scanner.scan(); //trigger scan
  portObj.on('data', (data) => {
    scanned_data = data;
    console.log(scanned_data); //displays scanned data but data multiplies with each scan. (e.g. 3 triggers logs 'barcode_data barcode_data barcode_data')  
  });
  console.log(scanned_data); //undefined
  res.send(scanned_data);
}

我是一名前端开发人员,但已经学习了很多有关Node的知识,试图弄清楚这一点。 las,我想我现在已经死胡同了。 我修改了.pipe()命令,并且预感这是解决方案的根源,但无法在可行的解决方案中归零。

有什么想法或建议吗?

您不应该假设在'data'事件中获得了多少'data' 期望一个字节或多个字节。 您需要知道用于接收完整“消息”的基础协议,以便停止监听数据。 此时,您应该发送对HTTP请求的响应。

暂无
暂无

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

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