<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ticket Archive - Robert Skibbe</title>
	<atom:link href="https://robbelroot.de/blog/tag/ticket/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>alias RobbelRoot – Freelance Full Stack Developer .NET</description>
	<lastBuildDate>Sun, 09 Jan 2022 19:47:37 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://robbelroot.de/wp-content/uploads/2020/12/cropped-favicon-32x32.png</url>
	<title>ticket Archive - Robert Skibbe</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Wie man einen NodeJS QRCode Scanner erstellt</title>
		<link>https://robbelroot.de/blog/wie-man-einen-nodejs-qrcode-scanner-erstellt/</link>
					<comments>https://robbelroot.de/blog/wie-man-einen-nodejs-qrcode-scanner-erstellt/#comments</comments>
		
		<dc:creator><![CDATA[Robert Skibbe]]></dc:creator>
		<pubDate>Sun, 19 Dec 2021 21:37:30 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[NodeJS Problemlösungen]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[einlesen]]></category>
		<category><![CDATA[erkennung]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[kamera]]></category>
		<category><![CDATA[lesen]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[qr]]></category>
		<category><![CDATA[qrcode]]></category>
		<category><![CDATA[quickresponse]]></category>
		<category><![CDATA[read]]></category>
		<category><![CDATA[reader]]></category>
		<category><![CDATA[scan]]></category>
		<category><![CDATA[scannen]]></category>
		<category><![CDATA[scanner]]></category>
		<category><![CDATA[stream]]></category>
		<category><![CDATA[ticket]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[webcam]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[zugangskontrolle]]></category>
		<guid isPermaLink="false">https://robbelroot.de/?p=7074</guid>

					<description><![CDATA[<p>Einen NodeJS QRCode Scanner erstellen zu wollen ist eine Aufgabe, an die glaube ich jeder mal in seiner Entwickler-Karriere kommt. QRCode Scanner kennt man nicht umsonst aus zahllosen Bereichen, weshalb die Funktionalität sehr beliebt ist. Darunter fallen Themen wie Zugangskontrollen in Form von z. B. Ticketsystemen, oder auch Bestellsysteme, bzw. &#8230;</p>
<p>Der Beitrag <a href="https://robbelroot.de/blog/wie-man-einen-nodejs-qrcode-scanner-erstellt/">Wie man einen NodeJS QRCode Scanner erstellt</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/NodeJS-QRCode-Scanner-erstellen.png"><img fetchpriority="high" decoding="async" width="1200" height="628" src="https://robbelroot.de/wp-content/uploads/2021/12/NodeJS-QRCode-Scanner-erstellen.png" alt="NodeJS QRCode Scanner erstellen" class="wp-image-7076" title="NodeJS QRCode Scanner erstellen"/></a><figcaption>NodeJS QRCode Scanner erstellen</figcaption></figure>






<p>Einen <strong>NodeJS QRCode Scanner</strong> erstellen zu wollen ist eine Aufgabe, an die glaube ich jeder mal in seiner Entwickler-Karriere kommt.</p>



<p><strong>QRCode Scanner</strong> kennt man nicht umsonst <strong>aus zahllosen Bereichen</strong>, weshalb die <strong>Funktionalität </strong>sehr <strong>beliebt </strong>ist.</p>



<p><strong>Darunter </strong>fallen Themen wie <strong>Zugangskontrollen</strong> in Form von z. B. <strong>Ticketsystemen</strong>, oder auch <strong>Bestellsysteme</strong>, bzw. <strong>logistische Erfassungen</strong>.</p>



<p><strong>Natürlich werden </strong>wir hierbei wie fast immer <strong>auf bekannte Tools zurückgreifen</strong>, da alles Andere meiner Meinung nach Quatsch wäre.</p>



<p><strong>Falls </strong>Du dies <strong>anders </strong>siehst, sage ich natürlich: &#8222;Have fun, das alles selbst zu bauen :P&#8220;.</p>



<p>Es <strong>kommt </strong>ein sehr <strong>bekanntes </strong>– wenn nicht sogar DAS – <strong>Node-Webserver-Framework</strong> schlechthin zum Einsatz.</p>



<p><strong>Zusätzlich </strong>verwenden wir eine <strong>eher unbekanntere Library</strong> für den QRCode-Scan, Welche allerdings deshalb nicht weniger nice ist :P!</p>



<p><strong>Auf </strong>die <strong>beiden Hilfsmittel </strong>komme ich <strong>natürlich </strong>in einem <strong>gleich </strong>Folgenden Moment innerhalb des Beitrages zu <strong>sprechen</strong>.</p>



<h2 class="wp-block-heading">NodeJS QRCode Scanner</h2>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/NodeJS-QRCode-Scanner-Projekt.png"><img decoding="async" width="1200" height="628" src="https://robbelroot.de/wp-content/uploads/2021/12/NodeJS-QRCode-Scanner-Projekt.png" alt="NodeJS QRCode Scanner Projekt" class="wp-image-7104" title="NodeJS QRCode Scanner Projekt"/></a><figcaption>NodeJS QRCode Scanner Projekt</figcaption></figure>



<p><strong>Aufgrund </strong>der <strong>hohen Nachfrage </strong>und einigen gelesenen Nachrichten dachte ich mir, ich setze mal ein schnelles <strong>Beispiel </strong>um.</p>



<p><strong>Ich </strong>selbst<strong> hatte</strong> <strong>zuletzt </strong>auch eine <strong>kleine Projekt-Idee</strong>, in Welcher ein solcher <strong>Scanner </strong>von Vorteil wäre.</p>



<p><strong>Auch hierbei </strong>ging es um eine <strong>Art Zugangskontrolle</strong>, bzw. driftete es <strong>auch in</strong> den <strong>Bereich Abrechnung</strong>/Prepaid-Lösung.</p>



<p>Der <strong>Kunde sollte </strong>sich dabei <strong>mit </strong>einem gewissen <strong>QRCode authentifizieren </strong>woraufhin dann <strong>weitere Prozesse </strong>angestoßen wurden.</p>



<p>Dafür habe ich letztendlich einen kleinen <strong>Rasperry Pi</strong> verwendet, Welchen ich noch <strong>zu Hause </strong>rumstehen hatte.</p>



<p><strong>Für </strong>die <strong>Verbindung </strong>an sich wurde <strong>keine Domain</strong> verwendet, <strong>da </strong>der Raspberry Pi <strong>nicht</strong> <strong>ans </strong>normale <strong>Internet angeschlossen </strong>war.</p>



<p><strong>Stattdessen </strong>wurde der Mini-Computer <strong>als </strong>eine Art <strong>Netzwerk </strong>verwendet, zu Welchem sich der Nutzer dann <strong>per Wifi </strong>verbunden hat.</p>



<p><strong>Anschließend </strong>konnte er eine auf dem Home-Screen <strong>hinterlegte</strong> <strong>Adresse aufrufen </strong>und nutzen.</p>



<h2 class="wp-block-heading">Vorbereitungen des QRCode Scanner Projekts</h2>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/10/Neues-Visual-Studio-Projekt-anlegen.png"><img decoding="async" width="640" height="380" src="https://robbelroot.de/wp-content/uploads/2021/10/Neues-Visual-Studio-Projekt-anlegen.png" alt="Neues Visual Studio Projekt anlegen" class="wp-image-6352" title="Neues Visual Studio Projekt anlegen"/></a><figcaption>Neues Visual Studio Projekt anlegen</figcaption></figure>



<p><strong>Starten</strong> wir <strong>nun </strong>mit dem <strong>Projekt und setzen </strong>es innerhalb der gewohnten Entwicklungsumgebung <strong>auf</strong>.</p>



<p>Ich <strong>benutze </strong>wie <strong>für </strong>meine <strong>web</strong>-, bzw. <strong>JavaScript </strong>basierten <strong>Projekte </strong>üblich, meine bevorzugte IDE namens <strong><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener">Visual Studio Code</a></strong>.</p>



<p><strong>Nachdem </strong>Du dein <strong>Editor </strong>des Vertrauens geöffnet hast, kannst Du <strong>nun </strong>ein neues <strong>Terminal</strong>/Konsole darin <strong>öffnen</strong>.</p>



<p><strong>Falls </strong>Dein <strong>Editor </strong>(traurigerweise) <strong>keine </strong>Art <strong>Terminal </strong>unterstützt, <strong>kannst </strong>Du natürlich <strong>auch </strong>die Windows-<strong>Konsole</strong>, <strong>oder </strong>das MacOS-<strong>Terminal verwenden</strong>.</p>



<p><strong>Erstelle </strong>dann einen <strong>neuen Ordner für </strong>das neue <strong>Projekt</strong>, z. B. über die eben geöffnete Konsole.</p>



<h3 class="wp-block-heading">Abhängigkeiten installieren</h3>



<p><strong>Navigiere anschließend </strong>innerhalb der <strong>Konsole in </strong>den erstellten <strong>Ordner</strong>.</p>



<p><strong>Nun </strong>können wir uns der <strong>Installation </strong>der <strong>Abhängigkeiten</strong>, also der <strong>sogenannten &#8222;Dependencies&#8220; </strong>widmen.</p>



<p>Die brauchen wir <strong>wie oben </strong>bereits <strong>erwähnt</strong>, um <strong>nicht </strong>gar <strong>selbst </strong>einen &#8222;Reader from scratch&#8220; <strong>bauen </strong>zu müssen.</p>



<p>Wir <strong>delegieren letztendlich </strong>die <strong>wichtigen Aufgaben </strong>wie &#8222;scan starten&#8220;, etc. an den bereits implementierten Scanner.</p>



<h4 class="wp-block-heading">ExpressJS</h4>



<p>Als <strong>erste Abhängigkeit </strong>installieren wir die &#8222;<strong>ExpressJS</strong>&#8222;-Bibliothek, welche uns <strong>neben Basis</strong>&#8211;<strong>Webserver</strong>-Funktionen auch <strong>Weitere </strong>bieten kann.</p>



<p><strong>Dabei </strong>geht es unter anderem um die <strong>Erreichbarkeit </strong>der <strong>clientseitig </strong>notwendigen <strong>Dateien</strong>, also den &#8222;Static-Files&#8220; sozusagen.</p>



<p><strong>Führe für </strong>die <strong>Installation </strong>des <strong><a href="https://expressjs.com/de/" target="_blank" rel="noreferrer noopener">&#8222;ExpressJS&#8220;-Frameworks</a></strong> folgenden <strong>Befehl </strong>in dem erstellen Ordner (Root-Verzeichnis) <strong>aus</strong>:</p>



<pre class="wp-block-code"><code>npm install express --save</code></pre>



<h4 class="wp-block-heading">QrScanner</h4>



<p><strong>Danach </strong>werden wir uns um die notwendige <strong>QR-Library</strong> kümmern, Welche uns den <strong>Scan-Vorgang</strong> und die <strong>Verarbeitung des QRCodes</strong> abnimmt.</p>



<p>Es <strong>handelt </strong>sich <strong>um </strong>das &#8222;qr-scanner&#8220;-Projekt von &#8222;nimiq&#8220;, Welches Du <strong>hier finden </strong>kannst: &#8222;<strong><a href="https://github.com/nimiq/qr-scanner" target="_blank" rel="noreferrer noopener">QR-Scanner von nimiq</a></strong>&#8222;.</p>



<p><strong>Installiere </strong>auch <strong>dieses Package mit </strong>dem &#8222;Node Package Manager&#8220; (<strong><a href="https://www.npmjs.com/" target="_blank" rel="noreferrer noopener">npm</a></strong>), indem Du <strong>folgenden Befehl </strong>ausführst:</p>



<pre class="wp-block-code"><code>npm install qr-scanner --save</code></pre>



<h2 class="wp-block-heading">Code – NodeJS QRCode Scanner</h2>



<p><strong>Beginnen </strong>wir <strong>ab </strong>diesem Punkt des Beitrages <strong>mit dem </strong>letztendlichen <strong>Code</strong>.</p>



<p>Wir werden <strong>3 Dateien benötigen</strong>, um den <strong>NodeJS QRCode Scanner</strong> umzusetzen.</p>



<p><strong>2 von</strong> diesen <strong>Dateien </strong>befinden sich <strong>im Webserver-Root</strong>, also <strong>im </strong>öffentlichen (<strong>public</strong>) Verzeichnis.</p>



<p>Das ist <strong>natürlich </strong>deshalb <strong>so</strong>, <strong>damit </strong>die <strong>Besucher auf </strong>die jeweiligen <strong>Daten</strong>/Dateien <strong>zugreifen </strong>können.</p>



<p>Unsere <strong>Ordner-Struktur</strong> wird also <strong>wie folgt </strong>aussehen (lasse Dich dabei nicht von den andere Dateien verwirren).</p>



<p>Die <strong>anderen Dateien &amp; der &#8222;node_modules&#8220;</strong>-Ordner wurden durch die &#8222;npm&#8220;-Installationen erstellt.</p>



<p><strong>Konzentriere </strong>Dich daher <strong>für&#8217;s Erste</strong> nur <strong>auf </strong>die <strong>markierten </strong>Dateien.</p>



<p>Sie sind <strong>nur für </strong>die installierten <strong>Abhängigkeiten </strong>von <strong>Relevanz </strong>und werden somit <strong>nicht von uns angefasst</strong>.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/Ordnerstruktur-fuer-den-NodeJS-QRCode-Scanner.png"><img loading="lazy" decoding="async" width="391" height="322" src="https://robbelroot.de/wp-content/uploads/2021/12/Ordnerstruktur-fuer-den-NodeJS-QRCode-Scanner.png" alt="Ordnerstruktur für den NodeJS QRCode Scanner" class="wp-image-7132" title="Ordnerstruktur für den NodeJS QRCode Scanner"/></a><figcaption>Ordnerstruktur für den NodeJS QRCode Scanner</figcaption></figure>



<h3 class="wp-block-heading">Die clientseitige GUI – index.html</h3>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/Die-Index-Datei-HTML-Code.png"><img loading="lazy" decoding="async" width="640" height="335" src="https://robbelroot.de/wp-content/uploads/2021/12/Die-Index-Datei-HTML-Code.png" alt="Die Index-Datei HTML-Code" class="wp-image-7154" title="Die Index-Datei HTML-Code"/></a><figcaption>Die Index-Datei HTML-Code</figcaption></figure>



<p>Auch <strong>in diesem Beispiel </strong>benötigen wir <strong>selbstverständlich </strong>eine &#8222;<strong>index</strong>.html&#8220;-Datei, Welche den <strong>Einstiegspunkt für </strong>die Seiten-<strong>Besucher </strong>darstellt.</p>



<p><strong>Ob </strong>diese <strong>Besucher nun </strong>eine konkrete <strong>Domain</strong>, eine <strong>lokale IP</strong>, o. Ä. besuchen spielt hier erstmal keine Rolle.</p>



<p><strong>Fazit ist </strong>dabei nur, <strong>dass </strong>der <strong>Nutzer </strong>eine <strong>GUI angezeigt </strong>bekommt, Welche <strong>durch </strong>den NodeJS-<strong>Server bereitgestellt </strong>wird.</p>



<p>Lege <strong>in </strong>Deinen erstellen<strong> Projekt </strong>nun also die <strong>erste Datei </strong>namens &#8222;index.html&#8220; an (Achtung, im &#8222;Public&#8220;-Ordner&#8220;).</p>



<p><strong>Diese </strong>wird dann einen sehr <strong>einfachen Aufbau </strong>bekommen, da wir <strong>nicht viel Code </strong>benötigen.</p>



<p>Die <strong>letztendliche Logik </strong>zur Verarbeitung des <strong>gescannten QRCodes</strong>, <strong>bestimmst </strong>Du bei Deinem Projekt natürlich <strong>selbst</strong>.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="index.html" data-enlighter-group="">&lt;!DOCTYPE html>
&lt;html lang="de">

&lt;head>
  &lt;meta charset="UTF-8">
  &lt;meta http-equiv="X-UA-Compatible" content="IE=edge">
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
  &lt;title>QR Code Scanner example&lt;/title>
&lt;/head>

&lt;body>
  &lt;video id="qr-scanner">&lt;/video>
  &lt;script type="module" src="app.js">&lt;/script>
&lt;/body>

&lt;/html></pre>



<p>Der <strong>wichtigste Teil </strong>ist der &#8222;<strong>Body</strong>&#8222;, wo wir das <strong>Video-Element</strong> <strong>und </strong>das dazugehörige &#8222;app.js&#8220;-<strong>Skript </strong>einbinden.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;body>
  &lt;video id="qr-scanner">&lt;/video>
  &lt;script type="module" src="app.js">&lt;/script>
&lt;/body></pre>



<p><strong>Alles Andere </strong>ist <strong>wie </strong>vermutlich <strong>bekannt </strong>einfach ein <strong>Standard</strong>&#8211;<strong>Aufbau </strong>für die HTML-Datei.</p>



<h3 class="wp-block-heading">Die clientseitige Logik – app.js</h3>



<figure class="wp-block-image size-full is-resized"><a href="https://robbelroot.de/wp-content/uploads/2021/12/Die-App-Logik-JavaScript-Code.png"><img loading="lazy" decoding="async" src="https://robbelroot.de/wp-content/uploads/2021/12/Die-App-Logik-JavaScript-Code.png" alt="Die App-Logik JavaScript-Code" class="wp-image-7156" width="640" height="335" title="Die App-Logik JavaScript-Code"/></a><figcaption>Die App-Logik JavaScript-Code</figcaption></figure>



<p>Legen wir <strong>als nächstes</strong> die <strong>&#8222;app.js&#8220;-Datei </strong>an und bestücken Diese mit Code.</p>



<p>In der <strong>ersten Zeile importieren </strong>wir den (Standard-) Export aus der QrScanner-Bibliothek, dabei handelt es sich um den <strong>Scanner selbst</strong>.</p>



<p><strong>Als nächstes </strong>setzen wir den &#8222;Worker-Path&#8220;, <strong>Welchen </strong>wir <strong>zur Verarbeitung </strong>benötigen.</p>



<p><strong>Dann definieren </strong>wir eine <strong>Variable </strong>namens &#8222;qrScanner&#8220;, Welche wir dann in dem <strong>Callback des Scan-Vorgangs</strong> verwenden können.</p>



<p><strong>Falls </strong>dies <strong>nicht notwendig </strong>ist, kann man diesen <strong>Variable </strong>natürlich auch &#8222;<strong>inline</strong>&#8220; definieren.</p>



<p>Im <strong>nächsten Schritt instanziieren </strong>wir einen neuen <strong>Scanner </strong>und setzen diesen in die Variable.</p>



<p>Im <strong>Konstruktor </strong>des <strong>Scanners</strong> benötigen wir <strong>zwei Parameter</strong>:</p>



<ul class="wp-block-list"><li>Das <strong>Video-Element</strong>, worin der Scan passiert, also die <strong>Kamera </strong>angezeigt wird</li><li>Ein <strong>Callback</strong>, um das <strong>Scan-Ergebnis</strong> zu verarbeiten</li></ul>



<p>Im <strong>Callback </strong>geben wir das <strong>Ergebnis des Scans </strong>aus <strong>und stoppen </strong>den Scanner wieder.</p>



<p><strong>Falls </strong>Du einen <strong>durchgängigen Scan </strong>haben möchtest, kannst Du das <strong>Stoppen </strong>natürlich auch einfach <strong>entfernen</strong>.</p>



<p><strong>Zum Schluss </strong>starten wir den <strong>Scanner </strong>natürlich, da <strong>ansonsten nicht </strong>viel <strong>passieren </strong>wird.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="app.js" data-enlighter-group="">import QrScanner from './qr-scanner/qr-scanner.min.js'
QrScanner.WORKER_PATH = 'qr-scanner/qr-scanner-worker.min.js'
let qrScanner
qrScanner = new QrScanner(document.querySelector('#qr-scanner'), result => {
  console.log('decoded qr code:', result)
  qrScanner.stop()
})
qrScanner.start()</pre>



<h3 class="wp-block-heading">Der Webserver – index.js</h3>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/QRCode-Scanner-Dateien-mit-Webserver-bereitstellen.png"><img loading="lazy" decoding="async" width="640" height="335" src="https://robbelroot.de/wp-content/uploads/2021/12/QRCode-Scanner-Dateien-mit-Webserver-bereitstellen.png" alt="QRCode Scanner Dateien mit Webserver bereitstellen" class="wp-image-7177" title="QRCode Scanner Dateien mit Webserver bereitstellen"/></a><figcaption>QRCode Scanner Dateien mit Webserver bereitstellen</figcaption></figure>



<p><strong>Nun widmen </strong>wir uns dem <strong>Server</strong>, also dem Herz des Ganzen, da der <strong>Client ohne Server keine Dateien </strong>verwenden könnte.</p>



<p>Zuerst definieren wir dafür 3 Konstanten:</p>



<ul class="wp-block-list"><li><strong>express </strong>– Die <strong>installierte Library</strong>, bzw. dessen Funktion</li><li><strong>app </strong>– Eine Instanz der <strong>Rückgabe der Express-Funktion</strong> (unser Server)</li><li><strong>port </strong>– Selbsterklärend, also der <strong>zu lauschende Port </strong>für den Server </li></ul>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const express = require('express'),
  app = express(),
  port = 3000</pre>



<p><strong>Danach kommen </strong>wir zum <strong>Basic-Code</strong> für die <strong>Express</strong>&#8211;<strong>Instanz</strong>.</p>



<p><strong>Dieser</strong> <strong>wird </strong>die App, bzw. den <strong>Server </strong>letztendlich zum <strong>Laufen </strong>bringen und Ihn <strong>auf </strong>dem bestimmten <strong>Port lauschen </strong>lassen.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">app.listen(port, () => {
  console.log(`Listening at https://localhost:${port}`)
})</pre>



<p>Das <strong>Einzige </strong>was wir nun noch <strong>zum Schluss </strong>tun müssen, ist die für den <strong>Client notwendigen </strong>Dateien zur <strong>Verfügung </strong>zu stellen.</p>



<p><strong>Bisher existiert </strong>der &#8222;<strong>public</strong>&#8222;-Ordner zwar, ist aber <strong>nicht erreichbar</strong>, bringt dem <strong>aufrufenden Client </strong>also nichts.</p>



<p><strong>Bringen </strong>wir also <strong>nun </strong>die <strong>letzten </strong>beiden notwendigen <strong>Zeilen </strong>an <strong>Code </strong>ins Spiel.</p>



<p>Mit dieser <strong>folgenden</strong>, ersten <strong>Zeile</strong>, <strong>stellen </strong>wir den &#8222;<strong>public</strong>&#8222;-Ordner <strong>zur Verfügung</strong>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">app.use(express.static('public'))</pre>



<p>Mit der <strong>nächsten Zeile </strong>ermöglichen wir dem <strong>Client </strong>den <strong>Zugriff auf</strong> die <strong>Scanner-Bibliothek</strong>, Welche wir <strong>vorher </strong>mit Hilfe des &#8222;Node Package Managers&#8220; <strong>installiert </strong>haben.</p>



<p>Der <strong>linke Parameter </strong>stellt dabei den <strong>Pfad </strong>dar, unter Welchem der <strong>rechts</strong> <strong>angegebene Ordner verfügbar </strong>gemacht wird.</p>



<p>Sieh&#8216; Dir <strong>hierzu </strong>ggf. <strong>noch einmal </strong>die clientseitige <strong>HTML</strong>-Datei an, <strong>wo </strong>wir Dateien dieses Ordners <strong>einbinden</strong>.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">app.use("/qr-scanner", express.static('node_modules/qr-scanner'))</pre>



<h3 class="wp-block-heading">Die App starten</h3>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/QRCode-Scanner-App-starten.png"><img loading="lazy" decoding="async" width="640" height="335" src="https://robbelroot.de/wp-content/uploads/2021/12/QRCode-Scanner-App-starten.png" alt="QRCode Scanner App starten" class="wp-image-7189" title="QRCode Scanner App starten"/></a><figcaption>QRCode Scanner App starten</figcaption></figure>



<p><strong>Final </strong>kannst Du die <strong>App </strong>nun <strong>starten</strong>, indem Du zuerst einmal mit der <strong>Konsole</strong>/dem Terminal in den <strong>Ordner navigierst</strong>.</p>



<p><strong>Danach </strong>kannst Du die <strong>&#8222;index.js&#8220;-Datei</strong> mit Hilfe von</p>



<pre class="wp-block-code"><code>node index</code></pre>



<p><strong>ausführen und </strong>den <strong>Server laufen </strong>lassen.</p>



<p><strong>Wenn </strong>Du <strong>nun </strong>die passende <strong>Adresse </strong>(<strong><a href="https://localhost:3000" target="_blank" rel="noreferrer noopener">https://localhost:3000</a></strong>) <strong>besuchst</strong>, solltest Du eine <strong>laufende </strong>und scan-bereite <strong>Webcam </strong>sehen.</p>



<p><strong>Achte darauf</strong>, <strong>dass </strong>Dein <strong>Browser über </strong>die passende <strong>Konfiguration </strong>verfügt.</p>



<p>Es <strong>kann </strong>z. B. <strong>sein</strong>, <strong>dass </strong>die <strong>Kamera durch </strong>den Aufruf aus einem <strong>nicht &#8222;https&#8220;-Host</strong> <strong>verhindert </strong>wird.</p>



<p><strong>Schaue </strong>dafür am besten <strong>in </strong>die <strong>Browser-Konsole</strong> (meist mit F12 zu erreichen) <strong>und passe </strong>testweise eventuelle <strong>Einstellungen an</strong>.</p>



<p>Nun kannst Du einen QRCode vor die Kamera halten und er sollte Diesen erkennen und loggen.</p>



<p>Ich <strong>habe dafür z. B. </strong>einfach auf Google nach &#8222;QRCode&#8220; gesucht und einfach den <strong>ersten Eintrag von Wikipedia verwendet</strong>.</p>



<h2 class="wp-block-heading">Kompletter Code – NodeJS QRCode Scanner</h2>



<h3 class="wp-block-heading">index.html</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!DOCTYPE html>
&lt;html lang="de">

&lt;head>
  &lt;meta charset="UTF-8">
  &lt;meta http-equiv="X-UA-Compatible" content="IE=edge">
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
  &lt;title>QR Code Scanner example&lt;/title>
&lt;/head>

&lt;body>
  &lt;video id="qr-scanner">&lt;/video>
  &lt;script type="module" src="app.js">&lt;/script>
&lt;/body>

&lt;/html></pre>



<h3 class="wp-block-heading">app.js</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import QrScanner from './qr-scanner/qr-scanner.min.js'
QrScanner.WORKER_PATH = 'qr-scanner/qr-scanner-worker.min.js'
let qrScanner
qrScanner = new QrScanner(document.querySelector('#qr-scanner'), result => {
  console.log('decoded qr code:', result)
  qrScanner.stop()
})
qrScanner.start()</pre>



<h3 class="wp-block-heading">index.js</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const express = require('express'),
  app = express(),
  port = 3000

app.use(express.static('public'))
app.use("/qr-scanner", express.static('node_modules/qr-scanner'))

app.listen(port, () => {
  console.log(`Example app listening at https://localhost:${port}`)
})</pre>



<h2 class="wp-block-heading">Downloads</h2>



<p><strong>Nicht vergessen </strong>nach dem Download <strong>zuerst </strong>einmal</p>



<pre class="wp-block-code"><code>npm install</code></pre>



<p>auszuführen, <strong>um </strong>die notwendigen <strong>Libraries </strong>in den &#8222;node_modules&#8220; Ordner zu <strong>installieren</strong>.</p>



<p>Ich <strong>habe </strong>Diesen für den Upload natürlich <strong>gelöscht </strong>um <strong>Speicher </strong>zu <strong>sparen</strong>.</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link" href="/downloads/nodejs/QRCodeScannerExample.zip" target="_blank" rel="noreferrer noopener">QRCodeScannerExample.zip</a></div>
</div>



<h2 class="wp-block-heading">Weiterführende Links</h2>



<ul class="wp-block-list"><li><a href="https://robbelroot.de/blog/wie-man-einen-nodejs-http-server-erstellt/"><strong>Wie man einen NodeJS Http Server erstellt</strong></a></li><li><strong><a href="https://robbelroot.de/blog/nodejs-verzeichnisse-mit-readdirsync-synchron-einlesen/" target="_blank" rel="noreferrer noopener">Verzeichnisse mit NodeJS auslesen</a></strong></li></ul>
<p>Der Beitrag <a href="https://robbelroot.de/blog/wie-man-einen-nodejs-qrcode-scanner-erstellt/">Wie man einen NodeJS QRCode Scanner erstellt</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://robbelroot.de/blog/wie-man-einen-nodejs-qrcode-scanner-erstellt/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
