2017-08-11 8 views
-1

私はnode-serialportを使用してバーコードスキャンアプリケーションを構築しています。私が立ち往生しているところでは、AJAX呼び出しを行ってスキャンをトリガーし、次にExpressサーバーが読み取り可能なストリームのデータに応答するようにします。Node.js読み込み可能なストリームを一時停止

は、デバイスを初期化します。

// 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); 
     } 
    }); 
    } 
} 

私は2つのアプローチを試してみましたが、私が探している「スキャン読み取り応答の行動を生み出すでもないしました。

まず、イベントリスナーをスキャンした後、リスナーでコールバックを使用してAJAXリクエストに応答しようとしました。このアプローチでは、「送信後にヘッダーを設定できません」というエラーが表示されます。私が理解しているからres.sendが複数回呼び出されているので、Nodeはこのエラーを投げています。

最初のアプローチ - リスナーにコールバックとしての応答:第2のアプローチでは

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' 
}); 
} 

、Iは、ローカル変数(「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); 
} 

私は、フロントエンドの開発者ですが、これを理解しようとしているノードについて多くを学ぶことを得ています。悲しいかな、私はこの時点で行き詰まったと思う。私は.pipe()コマンドを試してみて、解決策がある場所ではありがたいことがありますが、うまくいくソリューションではゼロにすることはできませんでした。

ご意見やご提案はありますか?

+0

node.jsストリームの実装は試していません。 node.jsストリームの実装のみを使用する必要がありますか?期待される結果は何か。 – guest271314

+0

他の制約のため、ストリームの実装にnode.jsを使用する必要があります。予想される結果は、シリアルデバイス(node-serialportによって接続されている)を使用してバーコードをスキャンし、そのデータをAjaxコールへの応答として送信できることです。 – MaxPowers

答えて

0

'data'イベントで取得するデータの量を前提にしてはいけません。 1バイトまたは複数バイトが必要です。完全な "メッセージ"を受信したときを知るために使用されている基礎となるプロトコルを知る必要があり、データの受信を停止することができます。その時点で、HTTPリクエストへの応答を送信する必要があります。

+0

私は、読み取り可能なストリーム内のデータチャンクは、何バイトのデータで構成されているのかと考えています。私はチャンクのサイズをキャッピングすることを考えていましたが、それは大きなチャンクで応答する道路の下の他の機能と衝突する可能性があります。完全なメッセージがいつ受信されたかを判断して、ノードがデータを受信するのを止める方法については、 – MaxPowers

関連する問題