我正在使用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在扫描的数据在本地变量中被捕获之前执行,因此显示为“未定义”。同样耐人寻味的是,在监听程序块中捕获的scanned_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的知识。遗憾的是,我想我已经走到了死胡同。我修改了.pipe()命令,有一种预感,那就是解决方案所在,但我不能专注于一个有效的解决方案。
有什么想法或建议吗?
发布于 2017-08-11 01:57:06
您不应该对您在'data'
事件中获得的数据块做出假设。应为一个字节或多个字节。您需要知道正在使用的底层协议,以便知道您何时收到完整的“消息”,以便您可以停止侦听数据。此时,您应该向HTTP请求发送一个响应。
https://stackoverflow.com/questions/45625593
复制相似问题