sql >> Databáze >  >> NoSQL >> MongoDB

Jaký je nejlepší způsob ukládání obrázků pro web expressjs, mongodb?

Kde ukládáme obrázky?

Řešení č. 1 v MongoDB

Takže prvním řešením je uložit obrázky uvnitř MongoDB. Může obsahovat obrazové soubory nebo jakýkoli typ souboru. Můžete tedy vzít soubor a spojit jej se záznamem v MongoDB a uložit jej přímo do své databáze.

S tímto přístupem je svázání stránky s popisem konkrétního oděvu s odpovídajícím obrázkem snadné, protože tento obrázek můžete vložit přímo do vývoje této stránky a váš klient by byl s tímto přístupem spokojen, protože když uživatel získá podrobný popis stránku tohoto kusu oblečení, která je dodávána s obrázkem.

Takže to je jedno možné řešení, stačí vzít obrázek a uložit přímo do MongoDB.

Budu však naznačovat, že to je špatný přístup. Důvodem toho, můžete svému klientovi sdělit, že dojde k odmítnutí, je to, že obvykle zaplatí za svou instanci Mongo ve smyslu množství úložiště, které jejich kopie Mongo využívá.

Čím více úložiště tedy spotřebují, tím více peněz měsíčně zaplatí.

Například, když jsem naposledy kontroloval použití MLab, účtovali 15 $ za GB. To je tedy 15 USD z kapsy vašich zákazníků za hostování obrázků v hodnotě 1 GB.

U další webové stránky elektronického obchodu mluvíme o 3 GB snadno, což se promítá do více či méně 330 obrázků, stejně jako 15 USD měsíčně.

Pokud tedy jeden z jejich projektových manažerů nahrává nový kus oblečení jednou denně, velmi rychle mluvíme o obrovských nákladech.

Osobně si tedy myslím, že ukládání jakéhokoli typu souboru přímo do MongoDB opravdu nepřipadá v úvahu, protože to bude velmi nákladné.

Takže to je jen jedno možné řešení.

Řešení č. 2 v HD připojené k serveru

Pojďme se tedy podívat na druhé řešení, které by vám mohlo být k dispozici. Můžete použít pevný disk, který je připojen k vašemu expresnímu serveru. Když se tedy tato aplikace nasadí do nějakého cloudového prostředí, jako je Heroku, Digital Ocean, Linode nebo AWS, obvykle získáte pevný disk spojený s vaší aplikací.

Takže možná vezmete obrázky a umístíte je na místní pevný disk. Tento přístup bude obhajovat velká většina online příspěvků a článků:

Jak k nahrávání, zobrazování a ukládání obrázků pomocí node.js a express

https://appdividend. com/2019/02/14/node-express-image-upload-and-resize-tutorial-example/

https://medium.com/@nitinpatel_20236/image-upload -via-nodejs-server-3fe7d3faa642

Jen s těmi třemi, které jsem shromáždil výše, máte docela robustní plán, se kterým můžete začít.

Každý říká, že vezměte soubor a uložte jej na místní pevný disk. V tomto konkrétním článku:

https://alligator.io/nodejs/uploading-files-multer-express/

zobrazují tento kód:

const storage = multer.diskStorage({
  destination: 'some-destination',
  filename: function (req, file, callback) {
    //..
  }
});

Používají knihovnu pro nahrávání obrázků s názvem multer který poskytuje diskStorage() engine pro nahrávání obrázků na disk.

Takže toto je jeden z přístupů, se kterým vývojová komunita obecně souhlasí.

Toto je dobrý přístup v kontextu mapování jedna ku jedné.

Problémy s tímto přístupem začínají nastat, když máme více strojů.

Příkladem je situace, kdy máte více počítačů hostovaných na Digital Ocean nebo Linode, kde je každé prostředí samostatnou instancí.

Pokud máte všechny obrázky uložené na přiloženém pevném disku a poté začnete svůj server škálovat, každý z nich bude mít svůj samostatný pevný disk.

Můžete mít tedy požadavek, který přijde prostřednictvím nástroje pro vyrovnávání zatížení a nástroj pro vyrovnávání zatížení rozhodne, kam požadavek odeslat, aby se mu líbil níže uvedený diagram:

Takže problém s výše uvedenou architekturou je, pokud se obraz uloží na jeden ze dvou pevných disků a později přijde požadavek na přístup ke stejnému obrazu, ale představte si, že požadavek bude směrován na druhý Express server s jiným pevným diskem. kde obrázek neexistuje.

To je problém, který se objeví, když začnete používat poskytovatele služeb, jako je Linode nebo Digital Ocean, kde máte mezi serverem a pevným diskem mapování jedna ku jedné.

Pokud je to zatím vše, co potřebujete, je to krátkodobé řešení, ale jakmile se aplikace začne škálovat, bude to problém.

Řešení č. 3 mimo úložiště dat

Toto třetí řešení je řešení, které jsem v minulosti používal s aplikacemi React with Node a aplikacemi Ruby on Rails. Ve skutečnosti můj web s portfoliem Ruby on Rails používá toto řešení a je umístěn na platformě Heroku.

Takže když se obrázek nahraje, místo aby se Express API snažilo uložit soubor lokálně jako na svém vlastním pevném disku, vezme obrázek a použije externí datové úložiště k uložení všech různých obrázků z aplikace.

Ten, který používám pro web svého portfolia a který jsem použil pro aplikace Node s aplikacemi React, byl Amazon S3, ale existuje také Azure File Storage a Google Cloud Storage. Tyto systémy jsou vyrobeny tak, aby podržely obrovské množství dat a mohou to být jakýkoli typ souboru, který si dokážete představit. Nejen obrázky jako ve vašem případě, ale video soubory, zvukové soubory atd.

Neexistuje žádný limit na množství úložiště, které můžete mít s S3, ale nemusíte používat S3, ale je to momentálně považováno za průmyslový standard, ale můžete snadno stejně dobře používat Azure a Google Cloud.

Výhodou tohoto řešení, kterou, myslím, váš zákazník ocení, je Amazon S3, který vám za úložiště účtuje dva haléře za gigabajt měsíčně.



  1. Jak napíšu tento dotaz SQL v syntaxi Mongodb?

  2. MongoDB dotaz s podmíněnou skupinou podle příkazu

  3. Kde stojí mongodb v teorému CAP?

  4. Vlastní funkce vypočítané sloupce mongodb projekce