2017-02-08 6 views
0

Es scheint zu wenig Dokumentation zu diesem Thema zu geben. Ich versuche ein Bild hochzuladen und setze es in meinem Keystone-Modell auf avatar: { type: Types.CloudinaryImage }.KeystoneJS CloudinaryImage Upload über API

Ich poste Inhalt als mehrteilige Formulardaten mit der folgenden Struktur: avatar: <raw_data>. Hier ist, wie ich damit umgehen in meine API:

exports.upload_avatar = function(req, res) { 
    if (!req.files.avatar) { 
     console.info('Request body missing'); 
     return res.status(400).json({ message: 'Request body missing', code: 20 }); 
    } 
    req.current_user.avatar = req.files.avatar; 
    req.current_user.save(); 
} 

wo current_user ist ein Mungo-Modell. Was ich verwirrend finde, ist, wie ich das Feld CloudinaryImage auf die Daten einstellen kann, die ich in der API erhalte.

Antwort

0

Ok einige nach dem durch den Quellcode zu graben, dachte ich, einen Ausweg zu tun:

exports.upload_avatar = function(req, res) { 
    req.current_user.getUpdateHandler(req).process(req.files, {fields: 'avatar'}, function(err) { 
     if (err) { 
      return res.status(500).json({ message: err.message || '', code: 10 }); 
     } 
     res.send(''); 
    }); 
} 

ich folgende gotchas hatte:

  • Verwendung getUpdateHandlerCloudinaryImage Feld zu aktualisieren.
  • Verwenden Sie "magische" Benennung für mehrteilige Formular Datenfelder, die Sie an Ihre API senden: {field_name}_upload, die in meinem Fall wäre avatar_upload.
  • Prozess , das ist ein Wörterbuch mit Ihren Feldnamen als Schlüssel und Ihre Datei Daten als Werte. req.body ist wegen einiger Nachbearbeitung mit multer leer.
  • rufen Sie den Update-Handler in Ihrem Keystone-Modell auf (Sie müssen ihn zuerst mit find holen) und nicht in einem bestimmten Feld. Geben Sie dann {fields: <>} an, um den Gültigkeitsbereich zu begrenzen. Andernfalls könnten einige Probleme wie Validierungsfehler beim Aktualisieren des gesamten Objekts auftreten.
0

Anstatt also nur den Avatar auf die Rohdaten zu setzen (was beispielsweise für ein Zeichenfolgenfeld funktionieren würde), müssen Sie den Update-Handler durchlaufen, der den speziellen Pfad {path}_upload in cloudinary image aufruft.

Sie sollten dann avatar.getUpdateHandler, vielleicht folgende this example tun können.

+0

Hm, habe ich versucht, 'req.current_user.getUpdateHandler (erf) beträgt.Verfahren (req.files, {Felder: 'Avatar'}, Funktion (err) {})', sowie Handler Aufruf auf das Feld "Avatar". Führt zu keinen Fehlern, obwohl die Datei auch nicht hochgeladen wird. –