首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >暂停Node.js可读数据流

暂停Node.js可读数据流
EN

Stack Overflow用户
提问于 2017-08-11 01:24:40
回答 1查看 195关注 0票数 0

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

初始化设备:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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被多次调用。

第一种方法--在侦听器中以回调的形式响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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在扫描的数据在本地变量中被捕获之前执行,因此显示为“未定义”。同样耐人寻味的是,在监听程序块中捕获的scanned_data似乎在每次扫描时都有多个。

第二种方法--监听程序外部响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的知识。遗憾的是,我想我已经走到了死胡同。我修改了.pipe()命令,有一种预感,那就是解决方案所在,但我不能专注于一个有效的解决方案。

有什么想法或建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-11 01:57:06

您不应该对您在'data'事件中获得的数据块做出假设。应为一个字节或多个字节。您需要知道正在使用的底层协议,以便知道您何时收到完整的“消息”,以便您可以停止侦听数据。此时,您应该向HTTP请求发送一个响应。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45625593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文