[英]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.