Сканер штрих-кода quagga-реагирует

По сути, я получаю демоверсию для работы, за исключением фактического сканирования. т.е. камера включена и т.д. Не уверен, что мне не хватает...

Вот мой код

Файл App.js:

import React, { Component } from 'react';
import Scanner from './Scanner';
import Result from './Result';

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      scanning: false,
      results: [],
    };
    this._scan = this._scan.bind(this);
    this._onDetected = this._onDetected.bind(this);
  }

  _scan() {
    this.setState({ scanning: !this.state.scanning });
  }

  _onDetected(result) {
    this.setState({ results: this.state.results.concat([result]) });
  }
  render() {
    return (
      <div>
        <button onClick={this._scan}>{this.state.scanning ? 'Stop' : 'Start'}</button>
        <ul className="results">
          {this.state.results.map(result => {
            <Result key={result.codeResult.code} result={result} />;
          })}
        </ul>
        {this.state.scanning ? <Scanner onDetected={this.state._onDetected} /> : null}
      </div>
    );
  }
}

Scanner.js файл:

import React, { Component } from 'react';
import Quagga from 'quagga';

export default class Scanner extends Component {
    constructor(props) {
        super(props);
        this._onDetected = this._onDetected.bind(this);
    }

    componentDidMount() {
        Quagga.init(
            {
                inputStream: {
                    type: 'LiveStream',
                    constraints: {
                        width: 640,
                        height: 480,
                        facingMode: 'environment', // or user
                    },
                },
                locator: {
                    patchSize: 'medium',
                    halfSample: true,
                },
                numOfWorkers: 2,
                decoder: {
                    readers: ['upc_reader'],
                },
                locate: true,
            },
            function(err) {
                if (err) {
                    return console.log(err);
                }
                Quagga.start();
            }
        );
        Quagga.onDetected(this._onDetected);
    }

    componentWillUnmount() {
        Quagga.offDetected(this._onDetected);
    }

    _onDetected(result) {
        this.props.onDetected(result);
    }

    render() {
        return <div id="interactive" className="viewport" />;
    }
}

Файл Result.js:

import React, { Component } from 'react';

export default class Result extends Component {
    render() {
        const result = this.props.result;

        if (!result) {
            return null;
        }
        return (
            <li>
                {result.codeResult.code} [{result.codeResult.format}]
            </li>
        );
    }
}

Спасибо, друзья!

4 ответа

Вы можете изменить тип читателя, который code_128_reader по умолчанию.

Например, большинство штрих-кодов, используемых в супермаркетах, соответствуют спецификации EAN (по крайней мере, там, где я живу), так что вы можете поместить это в Scanner.js изменить на ean_reader:

decoder: {
  readers: ["ean_reader"]
},

где Quagga начинается.

Список читателей можно найти здесь: Документация Quagga.

Если это не работает, я бы посоветовал попробовать другие комбинации считывателя / штрих-кода.

В документации сказано, что в Node вы должны использовать numOfWorkers: 0

https://serratus.github.io/quaggaJS/

Может быть, поздно отвечать, оставлю здесь на случай, если кому-то будет интересно.

Я смог заставить это работать. Мне нужно было решить несколько проблем:

  1. Применял другой декодер, как предлагал NorRetsim :
      decoder: {
  readers: ["ean_reader"]
},
  1. Исправить TypeError: this.props.onDetected is not a function. В App.jsскорректировал следующую строку:
    From:
    {this.state.scanning ? <Scanner onDetected={this.state._onDetected} /> : null}
    К:
    {this.state.scanning ? <Scanner onDetected={(result) => this._onDetected(result)} /> : null}
  2. Я также использовал Quagga2, но не знаю, имеет ли это значение в этом случае.

Оставив на всякий случай полную версию рабочего кода.

App.js:

      import React, { Component } from 'react';
import Scanner from './Scanner';
import Result from './Result';

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      scanning: false,
      results: []
    };
    this._scan = this._scan.bind(this);
    this._onDetected = this._onDetected.bind(this);
  }

  _scan() {
    this.setState({ scanning: !this.state.scanning });
  }

  _onDetected(result) {
    this.setState({ results: this.state.results.concat([result]) });
  }
  render() {
    return (
      <div>
        <button onClick={this._scan}>{this.state.scanning ? 'Stop' : 'Start'}</button>
        <ul className="results">
          {this.state.results.map((result, idx) => {
            return (<Result key={result.codeResult.code} result={result} />)
          })}
        </ul>
        {this.state.scanning ? <Scanner onDetected={(result) => this._onDetected(result)} /> : null}
      </div>
    );
  }
}

Scanner.js:

      import React, { Component } from 'react';
import Quagga from '@ericblade/quagga2';

export default class Scanner extends Component {
    constructor(props) {
        super(props);
        this._onDetected = this._onDetected.bind(this);
    }

    componentDidMount() {
        Quagga.init(
            {
                inputStream: {
                    type: 'LiveStream',
                    constraints: {
                        width: 640,
                        height: 480,
                        facingMode: 'environment', // or user
                    },
                },
                locator: {
                    patchSize: 'medium',
                    halfSample: true,
                },
                numOfWorkers: 0,
                decoder: {
                    readers: ['ean_reader'],
                },
                locate: true,
            },
            function(err) {
                if (err) {
                    return console.log(err);
                }
                Quagga.start();
            }
        );
        Quagga.onDetected(this._onDetected);
    }

    componentWillUnmount() {
        Quagga.offDetected(this._onDetected);
    }

    _onDetected(result) {
        this.props.onDetected(result);
    }

    render() {
        return <div id="interactive" className="viewport" />;
    }
}

Result.js (вообще не тронут):

      import React, { Component } from 'react';

export default class Result extends Component {
    render() {
        const result = this.props.result;

        if (!result) {
            return null;
        }
        return (
            <li >
                {result.codeResult.code} [{result.codeResult.format}]
            </li>
        );
    }
}

Добавьте /* eslint-disable */ для возврата.

          {
/* eslint-disable */
this.state.results.map(result => {
            <Result key={result.codeResult.code} result={result} />;
          })}
        </ul>
Другие вопросы по тегам