ThingWorx Flow > ThingWorx Flow SDK > Tutorial B: Tutorial zum SDK der ThingWorx Flow Konnektoren
Tutorial B: Tutorial zum SDK der ThingWorx Flow Konnektoren
Voraussetzungen
Im Folgenden werden die Voraussetzungen für dieses Tutorial beschrieben:
LTS-Version von Node.js wird mit der installierten ThingWorx Flow Version unterstützt.
Öffnen Sie die Eingabeaufforderung, und führen Sie den folgenden Befehl aus, um herauszufinden, welche Node.js-Version derzeit verwendet wird:
node -v
Eine integrierte Entwicklungsumgebung (IDE), die Node.js-Projekte bearbeiten können.
Das Tutorial verwendet WebStorm als IDE.
Kenntnisse auf mittlerem Niveau im Node.js-Code
Beispielordner
* 
Es wird empfohlen, den gleichen Rechner, auf dem ThingWorx Flow installiert ist, zu verwenden, um die installierten Komponenten zu verwenden.
Einführung 
Das Tutorial erläutert die Schritte, die zum Erstellen eines typischen Konnektors erforderlich sind. Wir erstellen einen Konnektor für Gmail, da die meisten Entwickler wahrscheinlich mit der Funktionsweise von Gmail vertraut sind. Durch das Erstellen des Konnektors machen Sie sich mit den Tools, Artefakten und Prozessen vertraut, die beim Erstellen eines Konnektors zum Einsatz kommen, und lernen, einen Konnektor für Ihre Anwendung zu erstellen. Für das Erstellen eines neuen Konnektors ist keine Bereitstellung von ThingWorx Flow erforderlich. Nachdem der Konnektor erstellt und lokal getestet wurde, kann er in einer lokalen Testinstanz bereitgestellt und getestet werden.
In diesem Tutorial wird Folgendes behandelt:
1. Erstellen eines Konnektorprojekts
2. Erstellen einer OAuth2-Konfiguration
3. Erstellen eines Lookups zum Suchen nach zugehörigen Filtern in Ihrem Gmail-Konto
4. Erstellen einer Aktion zum Abrufen der ID und des Betreff der E-Mail-Nachrichten, die dem ausgewählten Filter entsprechen
5. Erstellen eines Triggers, der das Initiieren eines neuen Flusses ermöglicht, wenn eine neue E-Mail eingeht
6. Hinzufügen von Symbolen
7. Bereitstellen von Konnektoren in einer lokalen Instanz von ThingWorx Flow
Schritt 1: Konnektorprojekt erstellen 
Ein Konnektor ist ein spezielles NPM-Paket, das aus verschiedenen Artefakten wie OAuth-Konfiguration, Aktion, Lookups und Triggern besteht. Das Projekt sollte das Muster für das Erstellen eines npm-Pakets folgen. Es sollte eine Datei package.json, einen Lib-Ordner, einen Testordner und Ordner für jedes der Artefakte und deren Versionen haben.
Öffnen Sie ein Fenster terminal/cmd, und navigieren Sie zu einem Ordner, in dem Sie ein neues Konnektorprojekt erstellen möchten. In diesem Tutorial erstellen wir den Konnektor im Verzeichnis c:\test
1. Wechseln Sie in das Testverzeichnis: cd c:\test
2. Führen Sie den folgenden Befehl aus, um ein Projekt zu erstellen: flow init <projectname>
Sie sollten Folgendes sehen:
cd c:\test
[2018-10-21T15:35:11.519] [INFO] default - Project gmail created successfully in .
3. Öffnen Sie das Projektverzeichnis in einer IDE, um die standardmäßig erstellten Artefakte zu prüfen.
Jedes Projekt enthält eine Datei index.js und eine Datei package.json. Nehmen Sie keine Änderungen an der Datei index.js vor, da die Datei benötigt wird, um die Konnektoren in den ThingWorx Flow Server zu laden.
* 
Die Datei package.json verweist auf ptc-flow-sdk. Ohne diese Abhängigkeit ist es nicht möglich, den Konnektor zu testen, bereitzustellen oder auszuführen. Sie stellt auch einige APIs bereit, durch die die Konnektorentwicklung einfacher und konsistenter wird.
1. Führen Sie die Schritte in Tutorial A aus.
2. Installieren Sie das async-Paket mit dem folgenden Befehl:
npm install async
3. Installieren Sie das request-Modul mit den folgenden Befehlen. Das request-Modul enthält eine API zum Erstellen von HTTP-Anforderungen.
npm install request
npm install request-promise
4. Installieren Sie das lodash-Modul, das eine Vielzahl nützlicher Funktionen bereitstellt:
npm install lodash
npm install ptc-flow-sdk@<Tool-Version> -g
Prüfen Sie die <Tool-Version> für Ihre Version von ThingWorx Flow hier.
* 
Alle Befehle im Tutorial werden im Konnektorprojektverzeichnis c:\test\gmail ausgeführt. So wird vermieden, dass der vollständige Pfad zum Konnektorverzeichnis unter Verwendung der Optionen -d/--projectDir eingegeben werden muss.
Schritt 2: OAuth2-Konfiguration erstellen 
* 
Bevor Sie beginnen, stellen Sie sicher, dass Sie die im Abschnitt "Konfiguration für das Testen von OAuths und Triggern" genannten Schritte ausgeführt haben.
Gmail verwendet OAuth 2.0 für die Authentifizierung. Daher verwendet der Beispielkonnektor OAuth 2.0 als Authentifizierungsmechanismus. Alle OAuth2-Anbieter schreiben vor, dass eine Anwendung eine Client-ID und ein Client-Verschlüsselungswort erstellt. Die Anwendung kann dann einen Benutzer auffordern, sich mit diesen Anmeldeinformationen beim OAuth-Anbieter anzumelden. Der Benutzer kann der Anwendung Berechtigungen zum Zugreifen auf Daten in seinem Namen gewähren. Die Berechtigungen werden nach Umfang definiert. Der Benutzer kann der Anwendung selektiv Zugriff auf seine Daten geben. Einzelheiten dazu, wie dies für Gmail und andere Google-Apps implementiert wird, finden Sie unter den folgenden Links.
Geben Sie einen Umleitungs-URL an. Die Umleitungs-URL:
https://<Hostname>:<Port>//Thingworx/Oauths/oauth/return sieht folgendermaßen aus:
https://flow.local.rnd.ptc.com/Thingworx/Oauths/oauth/return
Einige Systeme lassen mehrere Umleitungen zu.
* 
Stellen Sie sicher, dass der verwendete Host der Datei .flow\flow.json im Basisverzeichnis des Benutzers hinzugefügt wird. Wenn es dabei nicht um den tatsächlichen Hostnamen, sondern um einen Alias für den lokalen Host handelt, fügen Sie ihn zur Hostdatei Ihres Betriebssystems hinzu. Ein Beispiel für flow.json folgt.
{
"hostname": "localhost",
"port":443
}
Der Wert für hostname muss localhost sein.
Der Wert für port ist die auf ThingWorx Flow gehostete Portnummer. Standardmäßig ist dieser Wert 443.
Beispiel:
1. Klicken Sie unter Windows mit der rechten Maustaste auf den Editor, und wählen Sie dann "Als Administrator ausführen" aus.
2. Bearbeiten Sie die Hostdatei im Verzeichnis c:\windows\system32\drivers\etc\hosts, und fügen Sie den folgenden Eintrag hinzu, bzw. aktualisieren Sie einen Eintrag entsprechend:
127.0.0.1 flow.local.rnd.ptc.com
hier muss "flow.local.rnd.ptc.com" durch den Alias ersetzt werden.
Nachdem Sie die oben genannten Schritte ausgeführt haben, haben Sie eine Anwendung sowie eine Client-ID und ein Client-Verschlüsselungswort für die Anwendung erstellt.
1. Erstellen Sie eine OAuth-Konfiguration mithilfe des folgenden Befehls.
c:\test\gmail>flow add oauth gmail
[2018-10-21T16:26:54.398] [INFO] add-oauth - Oauth configuration gmail added successfully.
Durch diesen Befehl wird der Ordner \auth\oauth\gmail-gmail im Projektordner erstellt. Der Ordner enthält eine einzige Datei config.json.
In diesem Fall ist die Datei config.json eine Vorlage, die zum Arbeiten mit einer bestimmten OAuth-Anbieter wie Google angepasst werden muss.
2. Öffnen Sie sie in einem Texteditor oder einer IDE, und nehmen Sie dann die unten beschriebenen Änderungen vor. Stellen Sie sicher, dass die Datei ordnungsgemäß bearbeitet wird und eine gültige JSON-Datei bleibt.
3. Legen Sie Kategorie, Name, Titel und Symbole wie erforderlich fest. Einzelheiten zum Erstellen und Festlegen von Symbolen finden Sie im nachfolgenden Abschnitt Symbole zu einem Konnektor hinzufügen.
4. Suchen Sie nach dem Schlüssel oauth2_params_other, und ersetzen Sie ihn durch den Wert
[
"{\"access_type\":\"offline\"}"
]
5. Suchen Sie nach dem Schlüssel oauth2_params_scope, und ersetzen Sie seinen Wert durch das folgende JSON-Array:
[
"{\"https://www.googleapis.com/auth/gmail.labels\":\"Manage mailbox labels\"}",
"{\"https://www.googleapis.com/auth/gmail.insert\":\"Insert mail into your mailbox\"}",
"{\"https://www.googleapis.com/auth/gmail.modify\":\"All read/write operations except immediate, permanent deletion of threads and messages, bypassing Trash.\"}",
"{\"https://www.googleapis.com/auth/gmail.readonly\":\"Read all resources and their metadata—no write operations.\"}",
"{\"https://www.googleapis.com/auth/gmail.compose\":\"Create, read, update, and delete drafts. Send messages and drafts.\"}",
"{\"https://www.googleapis.com/auth/gmail.send\":\"Send email on your behalf\"}"
]
Beachten Sie den Wert von env_local_params. Hier ist "local" ein Name der Umgebung. Es gibt möglicherweise fünf mögliche Umgebungen, und diese werden durch die Schlüssel env_production_params, env_pre_prod_params, env_staging_params, env_local_params dargestellt. Der Wert wird dem Formular {{{local.CLIENT_SECRET}}} entnommen. local.CLIENT_SECRET ist eine Variable, die für den Namen der Umgebung steht. Sie sollte in drei öffnende und schließende geschweifte Klammern eingeschlossen werden. Diese Werte werden durch vom Kunden bereitgestellte Werte ersetzt, während der Dienst LoadOAuthConfiguration in ThingWorx Composer ausgeführt wird, um OAuths auf den ThingWorx Flow Server zu laden. Die Werte werden über eine JSON-Datei bereitgestellt. Der Wert wird ersetzt, wenn eine OAuth-Konfiguration nur für die Umgebung generiert wird, in der der ThingWorx Flow Server ausgeführt wird. Wenn die Umgebungsvariable NODE_ENV des Servers auf "production" festgelegt ist, wird der CLIENT_SECRET-Wert von "production" mit den in der OAuth-Datei angegebenen Werten gefüllt. Dies ermöglicht die Anpassung der OAuth-Konfiguration für jede Kundenbereitstellung.
6. Suchen Sie nach base_url, und ersetzen Sie den Wert durch https://accounts.google.com/o/oauth2.
7. Suchen Sie nach oauth2_auth_url, und ersetzen Sie den Wert durch /auth.
Schritt 3: OAuth-Konfiguration testen 
Eine OAuth-Konfiguration kann vor der Bereitstellung getestet werden. Dazu startet die ThingWorx Flow Befehlszeilenschnittstelle einen Browser, in dem Sie sich mit Ihren Anmeldeinformationen beim OAuth-Anbieter anmelden können. Nach erfolgreicher Authentifizierung wird das Zugriffstoken wird generiert und kann zur späteren Verwendung auf der Festplatte gespeichert werden. Jede Bereitstellungskonfiguration kann auch getestet werden, indem Sie die entsprechende Konfiguration im eingebetteten Chrome-Browser-Fenster auswählen.
Bevor Sie den Testbefehl ausführen können, müssen Sie eine Test-Datendatei erstellen, die die tatsächliche ClientID und das tatsächliche ClientSecret enthält, die durch "env_<environment-name>_params" wie oben beschrieben ersetzt werden. Dazu erstellen Sie eine neue JSON-Datei namens testOauthData.json im Verzeichnis c:\test und fügen ihr den folgenden Inhalt hinzu.
{
"gmail-gmail": {
"Test Gmail Oauth": {
"CLIENT_ID": "<your-client-id-here>"
"CLIENT_SECRET": ""<your-client-secret-here>"
}
}
}
Stellen Sie sicher, dass Sie <your-client-id-here> und <your-client-secret-here> durch die zuvor aus der Google-Konsole abgerufenen Werte ersetzen.
Stellen Sie als Nächstes sicher, dass die Datei .flow\flow.json im Basisverzeichnis des Benutzers den korrekten Hostnamen, den korrekten Port und die korrekte Zertifikat-Passphrase enthält. Dies ist nur erforderlich, wenn beim Erstellen des selbstsignierten Zertifikats eine bereitgestellt wurde.
Führen Sie den folgenden Befehl in einer Eingabeaufforderung aus: set FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true
Diese Variable ist erforderlich, da wir ein selbstsigniertes Zertifikat zum Ausführen des Tools verwenden.
1. Führen Sie den folgenden Befehl zum Testen der OAuth-Konfiguration aus.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Wählen Sie eine zu testende Konfiguration aus, und klicken Sie auf die Option zum Validieren der OAuth-Konfiguration.
3. Wählen Sie die Bereiche, auf die die Anwendung Zugriff haben soll, und klicken Sie auf Zulassen.
4. Geben Sie den Benutzernamen für Ihr Google-Konto ein. Dies kann ein beliebiges Google-Konto sein, es muss nicht notwendigerweise das Konto sein, das zum Erstellen von Client-ID und -Verschlüsselungswort verwendet wurde.
5. Geben Sie Ihr Passwort ein. Wenn die Authentifizierung erfolgreich ist, sollte das Zugriffstoken angezeigt werden.
6. Klicken Sie auf Speichern und beenden, um das Zugriffstoken für die spätere Verwendung zu speichern.
Die folgende Meldung wird in der Konsole angezeigt.
[2018-10-22T12:51:07.643] [INFO] oauth - Access token saved with ID :664ec37a-9720-460c-8536-fbf372198cb1
Die ID aus dieser Meldung wird verwendet, um weitere Artefakte zu testen, die vom Zugriffstoken abhängen, wie Lookups, Aktionen und Trigger. Die oben erzeugte ID sollte für alle Testbefehle mit der Token-Option -a/--access bereitgestellt werden.
* 
Wenn Sie eine Fehlermeldung erhalten, dass der Umleitungs-URI nicht übereinstimmt, sollten Sie sich vergewissern, dass die flow.json-Konfiguration korrekt ist und die URL, die der Fluss verwendet, der bei Google registrierten URL entspricht. Die vom Fluss verwendete Umleitungs-URL wird beim Starten des Tests in der Konsole angezeigt.
Beispiel: [2018-10-22T11:07:53.868] [INFO] oauthServer- Server started, redirect_uri used for oauth = https://flow.local.rnd.ptc.com:443/Thingworx/Oauths/oauth/return
* 
OAuth-Zugriffstoken sind nur kurzzeitig gültig. Bevor Sie das Zugriffstoken zum Testen einer Aktion, eines Lookups oder Triggers verwenden, sollten Sie den Befehl "flow test oauth" ausführen, um ein neues Token zu regenerieren.
Schritt 4: Lookup erstellen 
Lookups sind ein Suchmechanismus. Sie werden in der Regel verwendet, um eine Liste von Optionen für bestimmte Eingabefelder für Aktionen oder Trigger dynamisch abzurufen. Beispielsweise können E-Mail-Nachrichten in Gmail Beschriftungen zugeordnet sein. Dies hilft dabei, schnell nach zugehörigen E-Mails zu suchen, die alle mit der Beschriftung gekennzeichnet sind. Ein Endbenutzer kann sich jedoch wahrscheinlich nicht die Namen aller Beschriftungen merken, die in seinem Konto erstellt wurden. Das Lookup, das hier erstellt wird, erzeugt ID-Wert-Paare für Beschriftungen, die im Gmail-Konto gefunden werden. Eines oder mehrere von diesen kann dann verwendet werden, um die IDs und den Betreff der E-Mails mit diesen Beschriftungen abzurufen.
Lookups verfügen nicht über Metadaten, sondern werden stattdessen als einzige Datei index.js dargestellt. Sie sind auch nicht versioniert. Eine beliebige Anzahl von Lookup-Methoden kann in der Datei index.js vorhanden sein.
Zum Erstellen eines Lookups führen Sie den folgenden Befehl aus:
c:\test\gmail>flow add lookup
[2018-10-22T14:41:52.298] [INFO] add-lookup - Lookup added successfully
Durch das Ausführen des Befehls wird eine Datei index.js im Ordner Lookup\gmail erstellt.
Öffnen Sie die Datei index.js in Ihrer IDE, und fügen Sie ihr den unten aufgeführten Code hinzu.
Importieren Sie die folgenden Module ganz oben in die Datei.
const async = require('async')
const request = require('request')
const logger = require('ptc-flow-sdk').getLogger('gmail-lookup')
Kopieren Sie den folgenden Code, und fügen Sie ihn nach dem gesamten vorhandenen Code in die Datei ein.

gmailAPIs.getLabels = function (input, options, output) {
logger.debug('Trying to fetch labels')
// Gmail API to fetch th labels in the gmail account
options.url = 'https://www.googleapis.com/gmail/v1/users/me/labels'
// Validating that the authorization is done and we have a access_token to //make a request else throw the error
options.validateDependencies(input.access_token, function (err, status) {
if (err) {
return output({
error: err
})
}
// If the authorization is proper then execute the request
execute(input, options, output)
})
}
// common function for api to execute the request module
function execute (input, options, output) {
async.waterfall([
function (cb) {
// In input we get auth code which we can use to get access token
getAccessToken(input, options, cb)
}
], function (err, accessToken) {
if (err) {
return output({
error: err
})
} else {
// Execute the request to get the labels from the gmail api
requestExecute(input, accessToken, options, output)
}
})
}
// Extract the acces_token from the input and return it
function getAccessToken (input, options, cb) {
options.getAccessToken(input.access_token, function (err, oauth) {
if (err) {
cb(err)
} else {
oauth = JSON.parse(oauth)
cb(null, oauth.access_token)
}
})
}
// Make a request to the gmail url to get the labels
function requestExecute (input, accessToken, options, output) {
request({
method: 'GET',
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'application/json'
},
url: options.url
}, function (err, res, body) {
let result = []
if (err) {
return output({
error: err
})
}
if (res.statusCode === 401) {
return output({
error: 'Your access token is Invalid or Expired'
})
}
if (res.statusCode >= 200 && res.statusCode < 400) {
if (typeof (body) === 'string') {
body = JSON.parse(body)
}
result = filterResult(body.messages || body.labels || body, input)
var pageDetails = options.getPage(result, input, options)
var data = {
'results': result.slice(pageDetails.page, (pageDetails.page + options.maxResults))
}
data.next_page = options.getNextPage(data.results.length >= options.maxResults)
return output(null, data)
}
return output({
error: body
})
})
}
// filter result on the basis of output demand
function filterResult (body, input) {
var result = []
if (body && Array.isArray(body)) {
body.forEach(function (item, index) {
result.push({
'id': String(item.name),
'value': item.name
})
})
}
return result
}
Führen Sie den folgenden Befehl aus, um das Lookup zu testen:
1. Rufen Sie mit dem folgenden Befehl ein neues Zugriffstoken ab:
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Speichern Sie das Token, und beenden Sie.
3. Testen Sie das Lookup mit dem folgenden Befehl:
flow test lookup gmail getLabels -a cecd33a3-8a33-4c0c-b298-178fd80a9261 -l trace. Die vom Lookup generierte Ausgabe sollte angezeigt werden. Die Ausgabe ist ein JSON-Array aus IDs und Werten.
Schritt 5: Aktion erstellen und testen 
Eine Aktion interagiert mit dem externen verbundenen System, um eine Operation auszuführen. Normalerweise handelt es sich dabei um eine CRUD-Operation (Create Read Update Delete – Erstellen Lesen Aktualisieren Löschen). Aktionen nehmen Eingaben und erzeugen irgendeine Ausgabe. Die durch eine Aktion erzeugten Eingaben und Ausgaben müssen in der Datei action.json angegeben werden. Die Eingabe- und Ausgabeeigenschaften sind ein spezielles JSON-Schema, das zum Rendern des Eingabeformulars verwendet wird. Das Ausgabeschema wird verwendet, um die Zuordnungs-Benutzeroberfläche zu rendern. Weitere nützliche Eigenschaften sind das Tag und das Symbol, die verwendet werden, um Aktionen zu gruppieren und ein Symbol für die Aktion in der Benutzeroberfläche anzuzeigen.
Um eine neue Aktion zu erstellen, führen Sie folgenden Befehl aus:
c:\test\gmail>flow add action get-messages
[2018-10-22T16:26:53.925] [INFO] add-action - Action get-messages, version v1 added successfully
Öffnen Sie dann die Datei action.json C:\test\gmail\action\gmail-get-messages\v1\action.json in Ihrer IDE.
Legen Sie als Eingabe und Symboleigenschaft Gmail fest. Die Eingabeeigenschaft JSON-Schema ist wie im nachfolgenden Code gezeigt:
Set the input property to {
"title": "Get email messages",
"type": "object",
"properties": {
"auth": {
"title": "Authorize gmail",
"type": "string",
"oauth": "gmail-gmail",
"minLength": 1
},
"label": {
"title": "Label",
"type": "string",
"minLength": 1,
"lookup": {
"id": "getLabels",
"service": "gmail",
"enabled": true,
"searchable": false,
"auth": "oauth",
"dependencies": [
"auth"
]
}
}
}
}
Das Eingabeschema definiert ein einzelnes Eingabefeld. Es handelt sich dabei um eine Liste, da ein Lookup dafür angegeben ist. Bei Verwendung im Flow Composer wird das Lookup ausgeführt, und die zurückgegebenen Werte werden in der Liste angezeigt. Beachten Sie, wie Abhängigkeiten des Lookups beschrieben werden. Dies teilt dem System mit, dass das Authentifizierungsfeld ausgefüllt werden muss, bevor das Lookup aufgerufen wird.
Die Authentifizierungseigenschaft beschreibt die Authentifizierungsmethode, die diese Aktion verwendet. In diesem Fall verwenden wir eine OAuth-Konfiguration für Gmail.
Set the “output” property to {
"messages": {
"title": "Messages",
"type": "array",
"items": {
"type": "object",
"properties": {
"messageId": {
"type": "string",
"title": "Message Detail ID"
},
"subject": {
"type": "string",
"title": "Message Detail Sub"
}
}
}
}
}
* 
Die durch die Aktion erzeugte Ausgabe ist ein JSON-Array von JSON-Objekten. Jedes Objekt hat die Felder messageId und subject.
Öffnen Sie die Datei index.js in der IDE. Fügen Sie oben in der Datei den folgenden Code hinzu:
const rp = require('request-promise')
const logger = require('ptc-flow-sdk').getLogger('gmail-get-messages')
Ersetzen Sie die execute-Methode durch den folgenden Code:
this.execute = function (input, output) {
// Create a request header to get messages under a label selected from
const options = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages',
useQuerystring: true,
qs: {labelIds: ['STARRED']},
headers:
{
'Authorization': 'Bearer ' + input.auth,
'Content-Type': 'application/json'
}
}
rp(options).then((rawData) => {
const data = JSON.parse(rawData)
let mailRequests = []
if (data && data.messages) {
data.messages.forEach((msg) => {
mailRequests.push(this.fetchMessage(msg.id, input.auth))
})
return Promise.all(mailRequests)
} else {
logger.warn('No messages found')
Promise.resolve()
}
}).then((results) => {
if (results) {
let arr = []
results.forEach((result) => {
let resData = JSON.parse(result)
let msgHeader = resData.payload.headers.find(header => header.name === 'Subject')
arr.push({messageId: resData.id, subject: msgHeader ? msgHeader.value : 'No subject'})
})
return output(null, {messages: arr})
} else {
return output(null)
}
}).catch(err => {
return output(err)
})
}
Fügen Sie die nachfolgend angegebene neue Methode hinzu:
this.fetchMessage = function (msgId, authToken) {
const options = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages/' + msgId,
qs: { format: 'metadata', metadataHeaders: 'Subject' },
headers:
{
'Authorization': 'Bearer ' + authToken,
'Content-Type': 'application/json'
}
}
return rp(options)
}
Stellen Sie sicher, dass die Datei eine gültige JavaScript-Datei ist.
1. Rufen Sie das Zugriffstoken erneut mithilfe der folgenden Schritte ab:
Legen Sie FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true fest.
Führen Sie den folgenden Befehl aus, und beachten Sie dann die ID, die zurückgegeben wird.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Erstellen Sie eine neue JavaScript-Datei C:\test\gmail\test\actionTestData.js, fügen Sie den folgenden Code hinzu, und speichern Sie sie.
module.exports = {
testInput: {
label: 'STARRED'//use a label that applies to a few emails.
},
testOutputFn: function (input, actualOutput) {
// validate the actualOutput against expected output
// return a rejected promise to fail the validation or a resolved promise for success
// return Promise.reject(new Error('Validation successful'))
return Promise.reject(new Error('Validation failed'))
}
}
* 
Die Parameter -i/--input und -o/--output akzeptieren Daten oder Funktionen, die ein promise-Objekt zurückgeben.
Wird dieser Code auf einem Server ausgeführt, ist die Beschriftung als Teil des Eingabeparameters verfügbar und es kann als input.label auf sie zugegriffen werden. Das Test-Dienstprogramm führt kein Lookup durch. Daher muss die Ausgabe des Lookups an das Dienstprogramm übergeben werden.
3. Führen Sie den Testbefehl wie folgt aus:
C:\test\gmail>flow test action gmail-get-messages -a 685b7377-7000-
4a92-8679-8630c68a3265 -l debug -i testInput -f
C:\test\gmail\test\actionTestData.js -o testOutput
The test run should succeed.
Schritt 6: Abruf-Trigger erstellen und testen 
1. Führen Sie den folgenden Befehl aus, um einen neuen Abruf-Trigger zu erstellen:
flow add trigger -p
[2019-02-28T17:03:23.823] [INFO] add-trigger - Trigger gmail, version v1 added successfully
2. Öffnen Sie von Ihrer IDE die Datei trigger.json unterC:\test\gmail\trigger\poll\gmail \v1\trigger.json.
3. Legen Sie die Symboleigenschaft für Gmail wie folgt fest:
"icon": "gmail",
4. Legen Sie die Eigenschaften für Eingabe und Ausgabe fest.

Set the input property to
{
"properties": {
"auth": {
"type": "string",
"title": "Authorize gmail",
"minLength": 1,
"oauth": "gmail-gmail",
"propertyOrder": 1
},
"search": {
"type": "string",
"title": "Search Text",
"propertyOrder": 2,
"description": "Enter the search text to search for a specific email. E.g., from:john or subject:Christmas"
},
"customFilters": {
"type": "array",
"propertyOrder": 5,
"title": "Custom Filters",
"items": {
"type": "object",
"title": "Filter",
"properties": {
"input": {
"type": "string",
"title": "Input",
"minLength": 1
},
"operator": {
"type": "string",
"title": "Condition",
"enum": [
"Equals",
"GreaterThan"
],
"enumNames": [
"Equals",
"Greater Than"
]
},
"expected": {
"type": "string",
"title": "Expected",
"minLength": 1
}
}
}
}
},
"oneOf": [
{
"type": "object",
"title": "New Email",
"description": "Triggers when a new email is received",
"properties": {
"event": {
"type": "string",
"readonly": true,
"enum": [
"new_mail"
],
"options": {
"hidden": true
},
"propertyOrder": 3
},
"label": {
"type": "string",
"title": "Label",
"propertyOrder": 4,
"description": "Select a label for which you wish to set a trigger. E.g., If you select label as ‘Trash’, the trigger will fire off every time a new mail is moved to label named ‘Trash’ in your Gmail account."
}
}
},
{
"type": "object",
"title": "New Attachment",
"description": "Triggers when a new attachment is received",
"properties": {
"event": {
"type": "string",
"readonly": true,
"enum": [
"new_attachment"
],
"options": {
"hidden": true
},
"propertyOrder": 3
},
"label": {
"type": "string",
"title": "Label",
"propertyOrder": 4,
"description": "Select a label for which you wish to set a trigger. E.g., If you select label as ‘Trash’, the trigger will fire off every time a new mail is moved to label named ‘Trash’ in your Gmail account."
}
}
}
]
}
Das Eingabeschema definiert ein einzelnes Eingabefeld. Das Objekt oneOf definiert die vom Trigger unterstützten Ereignisse. Das Schema oben definiert zwei Trigger-Ereignisse:
Neue E-Mail
Neuer Anhang
Die Authentifizierungseigenschaft beschreibt die Authentifizierungsmethode, die von diesem Trigger verwendet wird. In diesem Fall verwenden wir eine OAuth-Konfiguration für Gmail.
Set the “output” property to
{
"new_mail": {
"type": "object",
"properties": {
"messageId": {
"type": "string",
"title": "ID",
"displayTitle": "ID"
},
"subject": {
"title": "Subject",
"displayTitle": "Subject",
"type": "string"
}
}
},
"new_attachment": {
"type": "object",
"properties": {
"attachments": {
"title": "Attachments",
"displayTitle": "Attachments",
"type": "array",
"items": {
"type": "object",
"properties": {
"mimeType": {
"title": "Mime Type",
"displayTitle": "Mime Type",
"type": "string"
},
"filename": {
"title": "File Name",
"displayTitle": "File Name",
"type": "string"
},
"attachmentId": {
"title": "Attachment ID",
"displayTitle": "Attachment ID",
"type": "string"
}
}
}
}
}
}
}
Das Ausgabeschema oben definiert Ausgabeeigenschaften für zwei Trigger-Ereignisse, die im Trigger-Eingabe-Schema definiert sind.
1. Öffnen Sie die Datei index.js in der IDE und fügen Sie anschließend den folgenden Code oben in der Datei hinzu:
const rp = require('request-promise')
const logger = require('ptc-flow-sdk').getLogger('gmail-trigger')
2. Ersetzen Sie die execute-Methode durch den folgenden Code:
Trigger.execute = function (input, options, output) {
// Create a request header to get messages under a label selected from
var date = new Date(options.unixTime * 1000)
const httpOpts = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages',
useQuerystring: true,
qs: { q: 'newer:' + date.getFullYear() + '/' + date.getMonth() + '/' + date.getDay() },
headers:
{
'Authorization': 'Bearer ' + input.auth,
'Content-Type': 'application/json'
}
}
rp(httpOpts).then((rawData) => {
const data = JSON.parse(rawData)
let mailRequests = []
if (data && data.messages) {
data.messages.forEach((msg) => {
mailRequests.push(this.fetchMessage(msg.id, input.auth))
})
return Promise.all(mailRequests)
} else {
logger.warn('No messages found')
Promise.resolve()
}
}).then((results) => {
if (results) {
let arr = []
results.forEach((result) => {
let resData = JSON.parse(result)
let msgHeader = resData.payload.headers.find(header => header.name === 'Subject')
arr.push({ messageId: resData.id, subject: msgHeader ? msgHeader.value : 'No subject' })
})
return output(null, { messages: arr })
} else {
return output(null)
}
}).catch(err => {
return output(err)
})
}
3. Fügen Sie die nachfolgend angegebene neue Methode hinzu:
Trigger.fetchMessage = function (msgId, authToken) {
const options = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages/' + msgId,
qs: { format: 'metadata', metadataHeaders: 'Subject' },
headers:
{
'Authorization': 'Bearer ' + authToken,
'Content-Type': 'application/json'
}
}
return rp(options)
}
* 
Stellen Sie sicher, dass die Datei eine gültige JavaScript-Datei ist.
Schritt 7: Zugriffs-Token abrufen 
Führen Sie die folgenden Schritte aus, um das Zugriffs-Token erneut abzurufen:
1. Legen Sie die folgende Eigenschaft fest: FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true
2. Führen Sie den folgenden Befehl aus, und beachten Sie dann die ID, die zurückgegeben wird.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
3. Führen Sie den Testbefehl wie folgt aus:
flow test trigger gmail execute -p -e new_mail -a e0d56340-2fc4-4618-931c-ad6c983ae0e5 --stopAfter 1 --unixTime 1551312000
Schritt 8: Symbole zum Konnektor hinzufügen 
1. Erstellen Sie im Konnektor-Projekt einen Ordner common.
2. Erstellen Sie unter dem Ordner common einen Ordner namens css.
3. Fügen Sie eine JSON-Datei mit dem folgenden Format hinzu:
{ "name": "connector-name",
"background": "#FFFFFF",
"png128pxBase64": "base64encodedbinarydata"
}
Die Eigenschaft name sollte der Name der Konnektors sein und sollte der Eigenschaft icon der Aktionen in Ihren metadata json-Dateien entsprechen.
Der Hintergrund sollte ein HEX-Farbcode HEX sein, wie im Beispiel dargestellt.
Die Symbolbilder sollten das .png-Format haben und die Binärdaten sollten mit Base64 codiert sein. Weitere Informationen finden Sie im Internet, wenn Sie nach Artikeln zum Konvertieren einer PNG-Datei in ihre base64-kodierte Binärdarstellung suchen.
War dies hilfreich?