So erstellen Sie eine NodeJS-Anwendung für Ihre Hyperledger Composer-Netzwerke

In diesem Artikel werde ich erläutern, wie Sie mit dem NodeJS-SDK eine Anmeldung mit .card-Datei, Ping und Abmeldefluss erstellen. In den zukünftigen Artikeln werde ich erläutern, wie Sie Assets erstellen, Transaktionen übermitteln und andere Dinge.

  • Komponist-Admin
  • Komponist-Kunde
  • Komponisten gemeinsam

VORAUSSETZUNG

Vergewissern Sie sich vor dem Einstieg in diesen Artikel, dass Sie sich mit den folgenden Themen vertraut gemacht haben:

  • JavaScript-OOP-Konzepte
  • Javascript Versprechen
  • Server-Routing und HTTP-Methoden.
  • ExpressJS

LOSLEGEN

Wir werden eine Serveranwendung mit expressjs erstellen und die oben genannten Bibliotheken verwenden, um mit dem Fabric-Netzwerk zu interagieren. Erstellen Sie eine einfache Express-App mit den folgenden Schritten.

Schritt 1. Projektordner erstellen und Abhängigkeiten installieren

Erstellen Sie einen Ordner in Ihrem System und installieren Sie das Knotenmodul expressjs mit npm.

mkdir myapp
cd myapp
Berühren Sie index.js
npm installiere express composer-admin composer-client composer-common --save

Jetzt haben Sie einen Ordner mit den Dateien index.js, package.json und node_modules in Ihrem myapp-Ordner.

Schritt 2. Grundlegende Boilerplate für Express-Server

Erstellen wir Endpunkte für die Anmeldung, den Ping und die Abmeldung, die alles als HTTP-POST-Methode haben.

const express = require ('express')
const app = express ()
app.post ('/ api / login', function (req, res) {
  // ...
})
app.post ('/ api / ping', function (req, res) {
  // ...
})
app.post ('/ api / logout', function (req, res) {
  // ...
})

Wir werden die folgende Liste von Express-Middlewares für die genannten Operationen verwenden.

  • express-fileupload - Zum Bearbeiten von Dateiuploads.
  • cors - Für domänenübergreifende API-Unterstützung.
  • body-parser - Zum Analysieren der im Hauptteil von HTTP-Anforderungen gesendeten Nutzdaten.
  • npm installiere express-fileupload cors body-parser –save

Diese Middlewares werden wie folgt importiert und verwendet:

const fileUpload = require ('express-fileupload');
var cors = require ('cors');
var bodyParser = require ('body-parser')
app.use (bodyParser.json ());
app.use (fileUpload ());
app.use (cors ({
    Ursprung: ['', '', ...],
  Anmeldeinformationen: wahr,
}));

Ersetzt einfach alle zulässigen Domänen im Ursprungsarray der cors Middleware-Konfiguration.

Schritt 3. Erstellen Sie eine Modellklasse

Die Model-Klasse ist die Javascript-Klasse, die alle netzwerkbezogenen Operationen als Funktionen enthält. Wir erstellen eine Objektinstanz dieser Klasse, um alle Funktionen aufzurufen, mit denen die definierten Operationen ausgeführt werden sollen.

Erstellen Sie eine Datei unter ./lib/MyNetwork.js, wobei MyNetwork als Name Ihres Netzwerks verwendet wird, und importieren Sie die folgenden Bibliotheken.

const BusinessNetworkConnection = require ('composer-client'). BusinessNetworkConnection;
const IdCard = erfordern ('composer-common'). IdCard;
const FileSystemCardStore = require ('composer-common'). FileSystemCardStore;
const BusinessNetworkCardStore = erfordern ('composer-common'). BusinessNetworkCardStore;
const AdminConnection = erfordern ('composer-admin'). AdminConnection;

Hier wird die BusinessNetworkConnection verwendet, um Verbindungsinstanzen zu erstellen, die zur Kommunikation mit dem Netzwerk als autorisierte Identität verwendet werden. IdCard wird verwendet, um die hochgeladene Kartendatei zu verarbeiten, Informationen und Zertifikate daraus zu extrahieren. FileSystemCardStore definiert den Typ des Kartenspeichers, BusinessNetworkCardStore AdminConnection ist die übergeordnete Klasse von BusinessNetworkCardStore, die von der Administratorverbindung verwendet wird. Sie ist für das Importieren, Exportieren, Ausstellen und Widerrufen von Identitäten sowie für andere Aktionen im Zusammenhang mit dem Administrator verantwortlich.

Um die Aktionen auszuführen, erstellen wir Instanzen der oben importierten Klassen.

var fileSystemCardStore = neuer FileSystemCardStore ();
var businessNetworkCardStore = neuer BusinessNetworkCardStore ();
var adminConnection = new AdminConnection ();

Jetzt erstellen wir die Klasse MyNetwork und einen Konstruktor dafür.

Klasse MyNetwork {
  Konstruktor (cardName) {
    this.currentParticipantId;
    this.cardName = cardName;
    this.connection = new BusinessNetworkConnection ();
  }
}

Hier werden drei Instanzvariablen erstellt. currentParticipantId soll die Teilnehmer des aktuell berechtigten Benutzers aufnehmen. cardName wird verwendet, um den Namen der hochgeladenen Karte zu speichern. connection ist das Verbindungsobjekt für die Kommunikation mit dem Netzwerk.

Als ersten Schritt müssen wir eine statische Funktion erstellen, mit deren Hilfe Sie die Karte in das Composer-Netzwerk importieren, mit der Zertifizierungsstelle Rücksprache halten und sie überprüfen können.

// ...
statischer ImportCardToNetwork (cardData) {
  var _idCardData, _idCardName;
  var businessNetworkConnection = new BusinessNetworkConnection ();
  Rückgabe IdCard.fromArchive (cardData) .then (Funktion (idCardData) {
    _idCardData = idCardData;
    BusinessNetworkCardStore.getDefaultCardName (idCardData) zurückgeben
  }). then (function (idCardName) {
    _idCardName = idCardName;
    return fileSystemCardStore.put (_idCardName, _idCardData)
  }). then (Funktion (Ergebnis) {
    return adminConnection.importCard (_idCardName, _idCardData);
  }). then (Funktion (importiert) {
    if (importiert) {
      Rückgabe von businessNetworkConnection.connect (_idCardName)
    } else {
      return null;
    }
  }). then (function (businessNetworkDefinition) {
    if (! businessNetworkDefinition) {
      null zurückgeben
    }
    return _idCardName;
  })
}
// ...

Bei der obigen Funktion senden Sie die Kartendaten, und sie erhalten zuerst den Namen der Karte und legen die Karte dann in den Laden. Hier prüft die zu speichernde Karte bei CA und überprüft die Echtheit der Karte . Nach dem Einstecken der Karte importieren wir die Karte mit Administratorverbindung. Wenn alles erfolgreich durchgeführt wurde, wird der Kartenname zurückgegeben, ansonsten wird der catch-Block aufgerufen.

Hier müssen Sie entweder eine Sitzung mit dem Kartennamen erstellen oder diese in der Datenbank mit einem Zugriffstoken speichern und dieses Zugriffstoken zur Sitzungsabwicklung an den Client senden. In unserem Tutorial speichere ich es einfach als Text und sende es in Kopfzeilen aufeinanderfolgender Anfragen. Ich empfehle jedoch dringend, bei Ihrer Produktionsanwendung nicht auf diese Weise vorzugehen.

Importieren Sie nun in der Datei index.js die MyNetwork-Klasse und aktualisieren Sie die Anmelderoute wie folgt.

const MyNetwork = require ('./ lib / MyNetwork');
// ...
app.post ('/ api / login', function (req, res) {
    MyNetwork.importCardToNetwork (req.files.card.data) .then (function (idCardName) {
        if (! idCardName) {
            res.status (403) .json ({message: "Logging failed"});
        }
        res.json ({message: "Logging Successful", accessToken: idCardName})
    }). catch (Funktion (Fehler) {
        res.status (403) .json ({message: "Login failed", error: error.toString ()})
    })
})

Nehmen wir an, dass das accessToken (hier nur der Kartenname) im Header als Autorisierung übergeben wird, die als req.headers.authorization abgerufen wird.

Als Nächstes aktualisieren Sie die Ping-Route, über die wir das Netzwerk anpingen, um die ID-Karteninformationen abzurufen.

app.post ('/ api / ping', function (req, res) {
    var cardName = req.headers.authorization;
    var mynetwork = neues MyNetwork (cardName);
    mynetwork.init (). then (function () {
        zurück mynetwork.ping ()
    }). then (function (userInfo) {
        res.json ({user: userInfo})
    }). catch (Funktion (Fehler) {
        res.status (500) .json ({error: error.toString ()})
    })
})

Die init-Funktion in der MyNetwork-Klasse wird jedes Mal aufgerufen, wenn Sie eine Aktion im Netzwerk ausführen möchten. Es wird der Kartenname verwendet und die Verbindung zu diesem Netzwerk als Karte hergestellt. Sobald dies durchgeführt wurde, wird das Verbindungsobjekt mit den Informationen der autorisierten Person aktualisiert, sodass ein zukünftiger Anruf autorisiert wird.

drin() {
  var _this = this;
  return this.connection.connect (this.cardName) .then ((result) => {
    _this.businessNetworkDefinition = result;
    _this.serializer = _this.businessNetworkDefinition.getSerializer ()
  })
}

Und die Ping-Funktion ruft die Ping-Funktion der Verbindung auf, um den aktuellen Teilnehmer zu überprüfen, der an das Verbindungsobjekt angehängt ist.

ping () {
  var _this = this;
  return this.connection.ping (). then (function (result) {
    Ergebnis zurückgeben
  })
}

Dies gibt die Teilnehmer zurück, die weiter verwendet werden können, um die anderen Informationen des Teilnehmers zu erhalten.

Zum Abmelden müssen wir nur die Karte aus dem Geschäft entfernen und den Status zurückgeben.

app.post ('/ api / logout', function (req, res) {
    var cardName = req.headers.authorization;
    var mynetwork = neues MyNetwork (cardName);
    mynetwork.init (). then (function () {
        Rückgabe von mynetwork.logout ()
    }). then (function () {
        res.json ({message: "Benutzer erfolgreich hinzugefügt"});
    }). catch (Funktion (Fehler) {
        console.log (Fehler);
        res.status (500) .json ({error: error.toString ()})
    })
})

Erstellen Sie in der Klasse eine Abmeldefunktion und verwenden Sie adminConnection, um die Karte aus dem Geschäft zu löschen.

Ausloggen() {
  var _this = this;
  return this.ping (). then (function () {
    return adminConnection.deleteCard (_this.cardName)
  })
}

DEMO

Probieren wir nun die Endpunkte aus und sehen uns die Antworten an.

Login Erstellen Sie eine Post-Anfrage an http: // localhost: 8080 / api / login und hängen Sie die Kartendatei an die Visitenkarte an.

Antwort

{
    "message": "Logging Successful",
    "accessToken": "varun @ trucerts-network"
}

Ping Post to: http: // localhost: 8080 / api / ping mit der Berechtigung im Header.

Antwort

{
    "Benutzer": {
        Version: 0.16.0,
        "Teilnehmer": "org.trucerts.User # 1"
    }
}

Probieren Sie es aus und sagen Sie uns, wie es geht!

Folgen Sie uns für weitere Artikel zu Hyperledger.