私は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()コマンドを試してみて、解決策がある場所ではありがたいことがありますが、うまくいくソリューションではゼロにすることはできませんでした。
ご意見やご提案はありますか?
node.jsストリームの実装は試していません。 node.jsストリームの実装のみを使用する必要がありますか?期待される結果は何か。 – guest271314
他の制約のため、ストリームの実装にnode.jsを使用する必要があります。予想される結果は、シリアルデバイス(node-serialportによって接続されている)を使用してバーコードをスキャンし、そのデータをAjaxコールへの応答として送信できることです。 – MaxPowers