2017-06-28 6 views
0

Angenommen, ich erstelle eine Website, auf der sich Benutzer registrieren, anmelden und ihr jeweiliges Profil sehen können.Wie speichert man Profilbilder in NodeJS & Mongodb?

Ich habe bereits die Register, Login und andere Funktionen des Profils Profil erstellt, aber ich weiß nicht, wie ich Profilbilder für jeden Benutzer einzigartig hinzufügen könnte.

So speichere ich gerade die Benutzerdaten.

mongoose.Schema({ 
username: { 
    type: String, 
    unique: true, 
    required: true 
}, 
email: { 
    type: String, 
    lowercase: true, 
    unique: true, 
    required: true 
}, 
password: { 
    type: String, 
    required: true 
} 
}); 

Wo sollte ich diese Bilder speichern? Ist es überhaupt möglich, .png-Dateien in einem Mongodb zu speichern?

Wenn ich wollte, dass die Bilder in meiner HTML/Blick Motor, würde ich einfach nutzen so etwas wie sehen:

<img src="<%= user.image %>"> 

Und dann das eigentliche Bild in meinen Dateien gespeichert irgendwo machen?

+0

Warum möchten Sie MongoDB als Objektspeicher anstelle von (vielleicht) Amazon S3 verwenden? Es gibt einen bestimmten Grund? –

+0

Warum möchten Sie binäre Daten an eine Vorlage senden, um zu rendern ist die größere Frage. Ihre Vorlagen sollten sich nur mit URLs befassen, die auf einen Image-Standort-Endpunkt verweisen, ob dieser Endpunkt das Abrufen von Daten aus MongoDB oder S3 ermöglicht oder das Dateisystem eigentlich nichts mit dem Template-Rendering selbst zu tun haben sollte. Lassen Sie den Browser das Bild holen. Erfinde das Rad nicht neu, wenn das Rad gut funktioniert. –

+0

Eigentlich .. Ich bin mir nicht sicher, was der beste Weg ist, dies zu tun. Dies ist das erste Mal, dass ich mit Javascript überhaupt etwas dazu mache. In PHP war es so einfach wie https://www.youtube.com/watch?v=jvnRFsFwiT8, aber ich bin mir nicht sicher, wie das in Node ... – Sidexx

Antwort

2

Es gibt drei Möglichkeiten, um Ihr Ziel zu erreichen.

  1. Speichern Sie das Feld direkt in MongoDB (Dokument)

  2. Speichern Sie das Feld direkt in MongoDB (GridFS)

  3. hochladen zu AmazonS3 und die ID direkt in MongoDB speichern (Dokument)

1) Nur in wenigen Fällen, in denen du ehrlich gesagt nicht so viel zu speichern hast (ich benutze dieses Szenario nie in der Produktion, aber viele Male im Test). Ich empfehle Ihnen daher nicht, sich in diese Richtung zu bewegen.

2) Es ist ideal für große Bilder und wo Sie etwas "Logik" hinzufügen müssen. Zum Beispiel habe ich in der Vergangenheit GridFS verwendet, um das "Vollbild" und eine Liste von Bildern in der Größe (user1_120_90.png, user1_320_240.png) an der gleichen Stelle und Zugriff auf sie sehr schnell zu haben, da Sie eine sehr geringe Latenz haben. Noch mehr kann ich ein "benutzerdefiniertes Feld" zu dem gespeicherten Objekt hinzufügen und dann eine Abfrage erstellen, um genau das zu erhalten, was ich brauche, ohne mit Amazon-S3 zu handeln.

3) Sehr skalierbare Lösung, die Ihnen einige Vorteile bietet (S3 ist weniger expansiv als GridFS in Bezug auf Kosten, da GridFS Ihnen als "Datenbankplatz" berechnet wird, wo Ihnen Amazon-S3 als "nur Objektspeicher" berechnet wird) In der Vergangenheit gab es viele Projekte, die mit einem einfach zu bedienenden und zu verwaltenden NPM-Modul ausgestattet waren.

Für Ihr Szenario kann ich vorschlagen, dass Sie die Datenbank vom Objekt-Speicher trennen Dateien auf Amazon, Azure, Google Wenn Sie dann mit einem Szenario mit sehr geringer Latenz rechnen müssen, können Sie vielleicht GridFS in Betracht ziehen (in meinem Fall war es das Geschäft, 400Mln 3D-Bilder mit viel Geometrie zu verwalten und in GridFS zu speichern) als Metadatenfeld)

Referenz GridFS: https://docs.mongodb.com/manual/core/gridfs/

Viel Glück!