Handler können anstelle von Ereignissen für Verbindungen und Anweisungen verwendet werden. Wenn Handler bereitgestellt werden, werden Ereignisse nicht ausgelöst. Für eine Verbindung einfach die Handler-Eigenschaft: Um einen Handler auf einer Anweisung zu verwenden, können Sie es auf drei Arten tun: Done Event Ein fertiges Ereignis (oder eine Handler-Funktion) wird ausgelöst, wenn eine Abfrage abgeschlossen ist. Es enthält einen Parameter, der über mehrere Eigenschaften verfügt: isError - true, wenn der Fehler auf dieser Anweisung hasRowCount - true, wenn das rowCount auf diesem Objekt gültig ist rowCount - Die Anzahl der Betroffenen in der Anweisung Anhänge Spalte Metadaten Spaltenmetadaten können eine von drei erhalten 1), indem Sie das Ereignis 8216metadata8217 auf die Anweisung 2) mithilfe der Metadateneigenschaft der Anweisung oder 3) mithilfe der Metadateneigenschaft der Zeile zuhören. Das Metadaten-Ereignis wird vor allen Zeilen in der Ergebnismenge ausgelöst. Pro Anweisungsausführung können mehrere Metadatenereignisse ausgelöst werden. Das Metadatenobjekt: columns - geordnetes Array von Spaltenobjekten columnsByName - Objekt, das Spaltenobjekte enthält, die durch die Groß - / Kleinschreibung beachtet werden columnname getColumn (column) - ruft eine Spalte ab, die auf dem übergebenen Index oder der Groß - / Kleinschreibung basiert Spaltenobjekt: Index - der Spaltenindextyp 0 - das Objekt vom Typ column8217s (siehe unten) length - die Länge der Spalte value8217s (nicht unbedingt jede row8217s-Länge) isNullable - boolean, ob der Wert column8217s null sein kann isCaseSensitive - boolean für if Der Name der column8217s-Zeichenfolge - der Name column8217s Der Name des column8217s-Typs: name - Der Name des vollständigen Caps-Typs, wie in der TDS-Spezifikation angegeben (nicht wirklich sinnvoll) sqlType - der Name des SQL Server-Datentyps - das statische Byte (ZB Int ist 4) emptyPossible - falls vorhanden und true, kann dieser Typ einen leeren Wert haben (z. B. Int win8217t haben diesen Wert, weil can8217t leer sein kann, aber ein VarChar kann) Verbindungsoptionen Das Optionsobjekt übergeben Kann der Konstruktor verschiedene Werte annehmen. Im obigen Beispiel verwenden wir 8216host8217, 8216port8217, 8216userName8217 und 8216password8217. Hier ist die vollständige Liste der Optionen: appName - Der Name dieser Anwendung / Client, wie es auf SQL-Server erscheinen wird. Standardwerte für die Datenbank 8216node-tds8217 - Die Datenbank für die Standardeinstellung bei der Anmeldung. Defaults zu user8217s Standarddatenbankdomäne - Die user8217s Windows-Domäne. Der derzeit unterstützte Host - Der Host des SQL-Servers. Standardwert für das Kennwort 8216localhost8217 - Das Kennwort für den SQL-Server-Benutzer-Port - Der Port des SQL-Servers. Standardwerte bis 1433 tdsVersion - Die (noch nicht freigelegte) TDS-Protokollversion für die Verwendung von userName - Erforderlicher Benutzername für den SQL-Server-Benutzer Fehler und Meldungen Fehler werden als eine Instanz von require (8216tds8217).TdsError dargestellt, die den systemeigenen node. js-Fehler erweitert. Es enthält ein Info-Objekt mit Detail über den Fehler. Dieses Detail hat denselben Inhalt wie ein Nachrichtenobjekt. Die Eigenschaften: error - true, wenn es sich um eine error8217s info handelt, false, wenn es eine Nachricht ist lineNumber - die lineNumber der Fehler - / Meldungsnummer - der SQL Server error / message number procName - der Name der gespeicherten Prozedur falls zutreffend serverName - der Name von Der Schweregrad des SQL-Servers - der Schweregrad des SQL-Servers des Fehler - / Meldungstextes - der Textinhalt des Fehlers / der Nachricht Spezielle Datentypen BigInt-Datentypen können in JavaScript nicht korrekt dargestellt werden, sie werden also als String bereitgestellt. Dies bedeutet, dass ein String verwendet werden kann, um es zu übergeben (aber kann auch eine ganze Zahl sein) und dass ein String die NUR Weise ist, die es abgerufen wird. Sie können eine Bibliothek wie node-bigint oder bigdecimal. js verwenden, um bei der Handhabung dieser Hilfe zu helfen. Binary und VarBinary Dies wird als Puffer auf beide Arten dargestellt. Dies bedeutet, dass Sie es als Puffer übergeben und es wird als Puffer abgerufen. Dinge, die auf diesem Projekt durchgeführt werden müssen oder wäre schön zu tun: Implementieren Sie 8216end8217 Ereignis auf der Verbindung Implementieren Sie Numerisch / Dezimal Document Verwendung mit Knoten-Pool Implementieren Sie Wrapper für gemeinsame node. js DB Abstraktionen Unterstützung Domain Based Authentication (NTLM) Unterstützung Native SSO-Authentifizierung mit dem aktuellen Benutzer (nur Windows wäre schön, wenn node-ffi Windows-Unterstützung auch als SSPI besitzt) Mehr Docs / Tests für mehrere Resultsets in einer einzigen Anweisung Unterstützt SQL 2008-Typen (Datum, Uhrzeit, datetime2, datetimeoffset, uniqueidentifier) Mehr Docs, API docs, cleaner docs Mehr / bessere Tests TDS-Server-Implementierung (könnte für SQL Server-Proxies gut sein) Verwenden Sie den JS-to-CLR-Compiler, um die Erzeugung von Triggern, gespeicherten Prozeduren und Datentypen in Javascript möglich zu machen (klingt einfach nach Spaß ) Im mit ffi und ref-Module für Node. js, um Bindungen zu codec2 C-Bibliothek zu erstellen. Hier ist die Beispiel-Implementierung der Codierung in C (c2enc. c): Und das ist, wie Im versuchen, Codierung Funktion aus JavaScript-Code aufrufen: Könnten Sie bitte erklären, wie ordnungsgemäß zuordnen Array von unsigned char Bits und Array von kurzen. Weil ich daran zweifle, dass ich es richtig mache. In Ref-Bibliothek docs Ive festgestellt, dass seine Möglichkeit, Zeichenfolge zuzuweisen, aber keine Referenz auf, wie ein Array von einigen anderen Datentypen zu erstellen. BTW, Im mit Knoten 0.10.26 wenn das zählt. Posted on June 22, 2012 by Node. js ist für eine Menge von Gründen, von denen ist die Geschwindigkeit, in der Sie sinnvoll zu bauen ist groß Anwendungen. Jedoch, wie wir alle wissen, kommt dies zum Preis der Leistung (im Vergleich zu nativen Code). Um dies zu umgehen, können Sie Ihren Code an die Schnittstelle mit schnellerem Code schreiben, der in C oder C geschrieben wurde. Alles was wir tun müssen, ist, dass Node weiß, wo dieser Code zu finden ist und wie man damit kommuniziert. Es gibt ein paar Möglichkeiten, dieses Problem zu lösen, je nachdem, welche Ebene der Abstraktion Sie wollen. Nun beginnen mit der niedrigsten Abstraktion, die die Node Addon ist. Ein Addon funktioniert durch die Bereitstellung der Leim zwischen Node und C / C-Bibliotheken. Für den typischen Node-Entwickler kann dies ein wenig kompliziert, wie youll haben, um in tatsächlich schreiben C / C-Code zum Einrichten der Schnittstelle. Allerdings, zwischen diesem Artikel und der Node-Dokumentation, sollten Sie in der Lage, einige einfache Schnittstellen funktionieren. Es gibt ein paar Dinge, die wir über gehen müssen, bevor wir in das Erstellen von Addons springen können. Zunächst müssen wir wissen, wie zu kompilieren (etwas Node Entwickler glücklich vergessen) über die native Code. Dies geschieht mit Hilfe von node-gyp. Dann kurz über nan reden. Die beim Handhaben verschiedener Node API Versionen hilft. Es gibt eine Menge von verschiedenen Arten von Prozessoren da draußen (x86, ARM, PowerPC, etc.), und noch mehr Betriebssysteme, um mit beim Kompilieren Ihres Codes befassen. Zum Glück, Knoten-Gyp Handles all dies für Sie. Wie von ihrer Github-Seite beschrieben, ist node-gyp ein plattformübergreifendes Befehlszeilentool, das in Node. js zum Kompilieren nativer Addonmodule für Node. js geschrieben wird. Im Wesentlichen ist Knoten-Gyp nur ein Wrapper um gyp. Die vom Chromium-Team hergestellt wird. Die Projekte README hat einige gute Anweisungen, wie man das Paket anbringt und verwendet, also sollten Sie das für mehr Details lesen. Kurz gesagt, um Knoten-Gyp zu verwenden, müssen Sie folgendes tun. Gehen Sie zu Ihrem Projektverzeichnis: Erstellen Sie die entsprechenden Build-Dateien mithilfe des Befehls configure, der entweder ein Makefile (auf Unix) oder vcxproj (auf Windows) erstellen wird: Und schließlich das Projekt erstellen: Dies generiert ein / build-Verzeichnis, Unter anderem die kompilierte Binärdatei. Auch bei der Verwendung von höheren Abstraktionen wie dem FFI-Paket, ist es immer noch gut zu verstehen, was passiert unter der Haube, so Id empfehlen Sie sich die Zeit nehmen, um die Ins und Outs von Knoten-Gyp zu lernen. Nan (Native Abstractions for Node) ist ein übersichtliches Modul, aber es sparen Sie Stunden der Frustration. Zwischen Node Versionen v0.8. V0.10. Und v0.12. Die V8-Versionen ging durch einige große Änderungen (zusätzlich zu Änderungen innerhalb von Knoten selbst), so nan hilft, diese Änderungen von Ihnen zu verstecken und bietet eine schöne, konsistente Schnittstelle. Diese native Abstraktion funktioniert durch Bereitstellung von C / C-Objekten / - Funktionen in der Header-Datei include ltnan. hgt. Um es zu verwenden, installieren Sie das nan-Paket: Fügen Sie diese Zeilen zu Ihrer binding. gyp-Datei hinzu: Und youre bereit, die Methoden / Funktionen von nan. h in Ihren Hooks anstelle des ursprünglichen verwenden ltnode. hgt-Code verwenden. Id empfehlen Ihnen sehr empfehlen nan. Es gibt nicht viel Sinn, das Rad in diesem Fall neu zu erfinden. Erstellen des Addons Bevor Sie mit dem Addon beginnen, sollten Sie sich einige Zeit nehmen, um sich mit den folgenden Bibliotheken vertraut zu machen: Die V8 JavaScript C-Bibliothek, die für die Interaktion mit JavaScript verwendet wird (zB Erstellen von Funktionen, Aufrufen von Objekten usw.). HINWEIS . Node. h ist die Standard-Datei vorgeschlagen, aber wirklich nan. h sollte stattdessen libuv verwendet werden. Eine plattformübergreifende asynchrone E / A-Bibliothek, die in C geschrieben wird. Diese Bibliothek eignet sich für alle Arten von E / A (Öffnen einer Datei, Schreiben in das Netzwerk, Einstellen eines Timers usw.) in Ihren nativen Bibliotheken Machen Sie es asynchron. Interne Knotenbibliotheken. Eines der wichtigsten Objekte zu verstehen ist node :: ObjectWrap. Aus denen die meisten Objekte stammen. Während des Restes dieses Abschnittes gehe ich Sie durch ein tatsächliches Beispiel. In diesem Fall, auch die Schaffung eines Hakens für die C ltcmathgt Bibliotheken pow - Funktion. Da sollte man fast immer nan benutzen. Das ist, was Ill mit in den Beispielen. Für dieses Beispiel sollten in Ihrem Addon-Projekt mindestens diese Dateien vorhanden sein: Die C-Datei muss nicht pow. cpp benannt werden. Aber der Name in der Regel spiegelt entweder, dass es ein Addon oder seine spezifische Funktion ist. Beachten Sie, dass es kein Semikolon () am Ende von NODEMODULE gibt. Dies geschieht absichtlich, da NODEMODULE eigentlich keine Funktion ist - es ist ein Makro. Der oben genannte Code kann ein wenig erschreckend auf den ersten für diejenigen, die kein C geschrieben haben in einer Weile (oder jemals), aber es ist wirklich nicht zu schwer zu verstehen. Die Pow-Funktion ist das Fleisch des Codes, wo wir die Anzahl der übergebenen Argumente, die Typen der Argumente, die native pow-Funktion aufrufen und das Ergebnis an die Node-Anwendung zurückgeben. Das Info-Objekt enthält alles über den Anruf, den wir kennen müssen, einschließlich der Argumente (und deren Typen) und ein Ort, um das Ergebnis zurückzugeben. Die Init-Funktion assoziiert meistens nur die Pow-Funktion mit dem Pow-Namen, und das NODEMODULE-Makro behandelt tatsächlich die Registrierung des Addons mit Node. Die package. json-Datei unterscheidet sich nicht wesentlich von einem normalen Node-Modul. Obwohl es scheint nicht erforderlich sein, die meisten Addon-Module haben gypfile: true-Satz in ihnen, aber der Build-Prozess scheint noch funktionieren ohne es. Hier ist, was ich für dieses Beispiel: Als nächstes muss dieser Code in eine pow. node-Datei, die die Binärdatei des Addon ist gebaut werden. Um dies zu tun, youll müssen Knoten-gyp, welche Dateien es benötigt, um zu kompilieren und die binäre resultierende Dateiname zu erzählen. Zwar gibt es viele andere Optionen / Konfigurationen, die Sie mit node-gyp verwenden können. Für dieses Beispiel brauchen wir nicht eine ganze Menge. Die binding. gyp-Datei kann so einfach sein wie: Jetzt mit node-gyp. Generieren Sie die entsprechenden Projekt-Build-Dateien für die gegebene Plattform: Und schließlich, das Projekt zu erstellen: Dies sollte dazu führen, dass eine pow. node-Datei erstellt wird, die sich im build / Release / - Verzeichnis befindet. Um diesen Hook in Ihrem Anwendungscode zu verwenden, benötigen Sie nur die Datei pow. node (ohne die Erweiterung. node): Node Foreign Function Interface Hinweis. Das ffi-Paket ist früher als node-ffi bekannt. Seien Sie sicher, den neueren ffi Namen Ihren Abhängigkeiten zu addieren, um viel Verwirrung während npm Installation zu vermeiden :) Während die Addon-Funktionalität, die von Node zur Verfügung gestellt wird, Ihnen die ganze erforderliche Flexibilität gibt, benötigen nicht alle Entwickler / Projekte sie. In vielen Fällen wird eine Abstraktion wie ffi gut tun, und in der Regel sehr wenig, um keine C / C-Programmierung. Ffi lädt nur dynamische Bibliotheken, die für einige begrenzt werden können, aber es macht auch die Haken viel einfacher einzurichten. Der obige Code funktioniert, indem Sie die Bibliothek laden (libm), und speziell die Methoden aus dieser Bibliothek (pow) laden. Die Doppel-, Doppel-, Doppellinie gibt an, welche Rückgabeart und - parameter die Methode ist, die in diesem Fall zwei Doppelparameter und eine Doppelrückgabe ist. Fazit Während es scheinen kann einschüchternd auf den ersten, die Schaffung eines Addon wirklich ist nicht zu schlecht, nachdem Sie hatten die Chance, durch ein kleines Beispiel wie dieses auf eigene Faust zu arbeiten. Wenn möglich, Id empfehlen Haken in einer dynamischen Bibliothek, um das Erstellen der Schnittstelle und das Laden des Codes viel einfacher, obwohl für viele Projekte dies möglicherweise nicht möglich oder die beste Wahl sein. Gibt es Beispiele für Bibliotheken, die Sie gerne sehen, Bindungen für Lassen Sie uns wissen, in den Kommentaren
No comments:
Post a Comment