2016-06-13 11 views
0

Ich versuche ein funktionelles Feld in meinem StrongLoop Server zu erstellen. Im Grunde wird der Client Daten in einem Feld namens "datas" (nicht in der Datenbank verfügbar) senden, das ich im Observer-Hook "vor dem Speichern" abfangen und eine benutzerdefinierte Verarbeitung durchführen und in Datenbankfeldern namens "processed_datas_1" und "processed_datas_2" speichern werde (diese 2 Felder sind in der Datenbank verfügbar).Definieren Sie ein Modell mit einem Funktionsfeld, das nicht in der Datenbank existiert

Ich bekomme Fehler, wenn ich versuche, die Datensätze zu holen - Spalte "Daten" existiert nicht.

Wie kann ich ein Feld definieren, das nicht in der Datenbank existiert. Es wird nur als Getter- und Setterfeld verwendet.

TIA: D

Antwort

0

Warum holen Sie das Attribut, das gar nicht existiert? Sie sollten die Spalten abrufen, die vorhanden sind. Um Daten, die nicht in der Modellspezifikation enthalten sind, zu senden, sollten Sie einfach einen Objekttyp als Nutzlast senden, und Sie können dann alles darin nach Belieben bearbeiten.

Sie sollten eine Remote-Methode einrichten, um die gewünschten Daten zu akzeptieren, und dann mit den integrierten CRUD-Methoden auf dem Server in die Datenbank schreiben. Versuchen Sie nicht, die CRUD-Methoden zu verwenden, um Geisterfelder zu bearbeiten. Es ist nicht nur schwierig, darüber nachzudenken, es könnte auch Leute erwischen, die neu in der Codebasis sind.

MODEL.remoteMethod('customRemoteMethodName', 
    { 
    accepts: [ 
     { 
     arg: 'data', type: 'object' 
     } 
    ], 
    returns: { 
     arg: 'result', 
     type: 'object' 
    } 
    } 
); 

Die data arg kann oben enthalten, was auch immer Sie möchten, und innerhalb der Remote-Methode können Sie manipulieren und die Daten überprüfen, bevor an die DB zu schreiben:

MODEL.customRemoteMethodName = function(payload, cb) { 

    // modify payload.datas into processed_datas_1 and processed_datas_2 
    // processData() defined elsewhere or imported 
    let processed = processData(payload.datas); 

    let modelData = { 
    processed_datas_1: processed.data_1, 
    processed_datas_2: processed.data_2 
    //... other required model fields 
    }; 

    // suggest validation here 

    // use built in CRUD with processed data 
    // 
    MODEL.create(modelData, function(err, modelInstance) { 
    if(err) {return cb(err);} 

    // call remote method callback to return result to client 
    cb(null, modelInstance); 

    }); 

}; 

Die beobachten Haken sein kann manchmal nützlich, aber es ist immer eine gute Idee, zweimal über die "magische" Verarbeitung nachzudenken, die sie zur Verfügung stellen können. Diese Arten von "Nebenwirkungen", die nicht mit den tatsächlichen Modelldefinitionen zusammenhängen, können zu Problemen bei der Dokumentation und Codierung in einem Team mit neuen Mitgliedern führen.

Durch eine benutzerdefinierte Remote-Methode verwenden, den Sie hinzufügen, Code-as-Dokumentation (Name der Remote-Methode so etwas wie MODEL.processAndCreate) und zugleich alle Datenmanipulation direkt vor der Entwickler setzen.

+0

TY für den Vorschlag, aber Loopback ist nicht die einzige API, die ich mit meinem mobilen Client verwende, habe ich einen Server-Wrapper in meinem mobilen Client, der die Server API wählen kann, so die Methoden über die verschiedenen APIs müssen ähnlich bleiben. –