Ich mache weiterhin Werbung fΓΌr meinen Empfehlungslink zum IaaS-Anbieter Exostate und reiche den zweiten Artikel meiner Werbekampagne ein. Im ersten Artikel habe ich die Anwendung ' vue-storefront ' als separaten Server bereitgestellt und gestartet, ohne an Daten gebunden zu sein, und mein kommerzielles Interesse am Verkauf von Exoscale-Diensten auf solch absurde Weise maskiert. Meine erbΓ€rmlichen Versuche wurden von einem Kollegen von aol-nnov erfolgreich erΓΆffnet und ich musste sauberes Wasser trinken . Nun, die zweite Phase meiner Werbekampagne unterscheidet sich nicht von der ersten - dieselbe Seite mit einem Fehler:

Die Vorderseite ist jetzt mit dem Backend verbunden (' vue-storefront-api '), aber die gleiche dΓΌstere Meldung " Etwas ist schief gelaufen ... " im Browser des Clients. Daher habe ich, nachdem ich die falsche Bescheidenheit verworfen hatte, meinen Verweislink zu kat gerendert und die gesamte Verkleidung unter kat gestellt - Details darΓΌber, wie ich Vue Storefront mit der Vue Storefront-API kombiniert habe.
Zweck
In dieser Phase habe ich mir die Aufgabe gestellt, ein minimal funktionales Backend zu erstellen und die Front darauf zu schlieΓen.
Schema
Um es ein wenig klarer zu machen, gebe ich ein Bild, das ich basierend auf der Analyse von Anwendungskonfigurationen entwickelt habe:

Die vue-storefront
Bereitstellungssequenz vue-storefront
ich in einem vorherigen Artikel zitiert habe. Daher mΓΌssen vue-storefront-api
, Elasticsearch und Redis angehoben werden. Gemessen an der Adresse / dem Port in der configQL ist vue-storefront-api
fΓΌr GraphQL selbst verantwortlich.
Arbeitsumgebung
FΓΌr diese Phase hatte ich auch eine kleine Version des Linux Ubuntu 18.04 LTS 64-Bit-Servers (2x 2198 MHz CPU, 2 GB RAM, 10 GB Festplatte). Das SchΓΆne an IaaS ist, dass Sie immer wieder von vorne anfangen kΓΆnnen, indem Sie zuvor fehlgeschlagene Experimente in den MΓΌll werfen.
Erste Stufe
Hier ist das Skript zum Wiederholen der Schritte des ersten Schritts:
Es wird notwendig sein, die automatische Bereitstellung von vue-storefront
ohne menschliches Eingreifen in Betracht zu ziehen. Aber vsf
mit vsf
.
Installieren Sie Elasticsearch
# apt install openjdk-11-jre-headless -y # java -version openjdk version "11.0.4" 2019-07-16 OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3) OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing) # apt-get install apt-transport-https # wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - # add-apt-repository "deb https://artifacts.elastic.co/packages/7.x/apt stable main" # apt update # apt install elasticsearch -y
Bevor Sie den Dienst starten, mΓΌssen Sie die Konfiguration von Elasticsearch Γ€ndern, damit Sie von auΓen auf den Dienst zugreifen kΓΆnnen (dies ist nicht erforderlich, aber fΓΌr mich bequemer):
$ sudo nano /etc/elasticsearch/elasticsearch.yml cluster.name: habr_demo node.name: exo01 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 0.0.0.0 discovery.seed_hosts: []
Servicestart:
# service elasticsearch restart
Und ΓΌberprΓΌfe seine Leistung:
$ curl -X GET "http://localhost:9200/?pretty" { "name" : "exo01", "cluster_name" : "habr_demo", "cluster_uuid" : "_na_", "version" : { "number" : "7.4.2", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96", "build_date" : "2019-10-28T20:40:44.881551Z", "build_snapshot" : false, "lucene_version" : "8.2.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
Installieren Sie Redis
# apt install redis-server -y
Genau wie Elasticsearch konfiguriere ich Redis so, dass von auΓen zugegriffen werden kann:
# nano /etc/redis/redis.conf bind 0.0.0.0 # service redis-server start
Ich starte den Dienst und ΓΌberprΓΌfe seine Leistung:
# service redis-server start # redis-cli > set test "It's working!" > get test > exit
Installieren Sie vue-storefront-api
$ cd ~ $ git clone https://github.com/DivanteLtd/vue-storefront-api.git
VerknΓΌpfung von Front und Backend
Vordere Konfiguration
Die verfΓΌgbaren Front-Konfigurationsoptionen finden Sie in ~/vue-storefront/config/default.json
. Ich habe einige Optionen in ~/vue-storefront/config/local.json
:
{ "server": { "host": "0.0.0.0", "port": 3000 }, "redis": { "host": "194.182.181.149", "port": 6379, "db": 0 }, "graphql": { "host": "194.182.181.149", "port": 8080 }, "api": { "url": "http://194.182.181.149:8080" }, "elasticsearch": {} }
server.host|.port
- Ich binde einen NodeJS-Server, der den Inhalt fΓΌr das Frontend an alle verfΓΌgbaren IP-Adressen auf dem entsprechenden Port ausgibt.
graphql
und graphql
- binden an die externe IP-Adresse meines graphql
. Ich weiΓ nicht, ob der NodeJS-Server, der den Inhalt ausgibt, diese Einstellungen verwendet oder ob diese Einstellungen clientseitig im Browser verwendet werden. Daher habe ich die externe Adresse angegeben.
api.uri
- hier muss unbedingt die externe IP-Adresse des Servers eingetragen werden, weil In der vorherigen Phase habe ich API-Aufrufe vom Browser (PWA-Anwendungen) in den Anforderungsprotokollen (Registerkarte " Network
in der Symbolleiste) gesehen. Dies ist die Portadresse, an der der NodeJS-Server der Anwendung Vue vue-storefront-api
hΓ€ngt.
Backend-Konfiguration
VerfΓΌgbare Konfigurationsoptionen kΓΆnnen auch in ~/vue-storefront-api/config/default.json
. Hier sind die ΓΌberschriebenen Optionen in ~/vue-storefront-api/config/local.json
:
{ "server": { "host": "0.0.0.0", "port": 8080 }, "elasticsearch": { "host": "localhost", "port": 9200 }, "redis": { "host": "localhost", "port": 6379 } }
server.host|.port
- Ich binde einen NodeJS-Server, der den Inhalt fΓΌr die API bereitstellt, an alle verfΓΌgbaren IP-Adressen auf dem entsprechenden Port.
elasticsearch
und redis
befinden sich auf demselben Host wie der API-Server, daher wiederhole ich nur die Standardparameter.
Anwendungserstellung
Front
$ cd ~/vue-storefront $ yarn install $ yarn build
Backend
$ cd ~/vue-storefront-api $ yarn install $ yarn build
Anwendungen starten und stoppen
$ cd ~/vue-storefront-api $ yarn start ... $ cd ~/vue-storefront $ yarn start ... [PM2][WARN] Applications server not running, starting... [PM2] App [server] launched (4 instances) ββββββββββββ¬βββββ¬ββββββββββ¬βββββββ¬βββββββββ¬ββββββββββ¬βββββββββ¬ββββββββ¬ββββββββββββ¬βββββββββ¬βββββββββββ β App name β id β mode β pid β status β restart β uptime β cpu β mem β user β watching β ββββββββββββΌβββββΌββββββββββΌβββββββΌβββββββββΌββββββββββΌβββββββββΌββββββββΌββββββββββββΌβββββββββΌβββββββββββ€ β api β 0 β fork β 3690 β online β 0 β 11s β 0% β 85.2 MB β ubuntu β disabled β β o2m β 1 β fork β 3696 β online β 0 β 11s β 0% β 48.4 MB β ubuntu β disabled β β server β 2 β cluster β 3763 β online β 0 β 0s β 26.7% β 66.9 MB β ubuntu β disabled β β server β 3 β cluster β 3770 β online β 0 β 0s β 0% β 68.1 MB β ubuntu β disabled β β server β 4 β cluster β 3785 β online β 0 β 0s β 0% β 40.9 MB β ubuntu β disabled β β server β 5 β cluster β 3796 β online β 0 β 0s β 0% β 40.9 MB β ubuntu β disabled β ββββββββββββ΄βββββ΄ββββββββββ΄βββββββ΄βββββββββ΄ββββββββββ΄βββββββββ΄ββββββββ΄ββββββββββββ΄βββββββββ΄βββββββββββ Use `pm2 show <id|name>` to get more details about an app Done in 1.49s.
- $ cd ~/vue-storefront-api $ yarn start ... $ cd ~/vue-storefront $ yarn start ... [PM2][WARN] Applications server not running, starting... [PM2] App [server] launched (4 instances) ββββββββββββ¬βββββ¬ββββββββββ¬βββββββ¬βββββββββ¬ββββββββββ¬βββββββββ¬ββββββββ¬ββββββββββββ¬βββββββββ¬βββββββββββ β App name β id β mode β pid β status β restart β uptime β cpu β mem β user β watching β ββββββββββββΌβββββΌββββββββββΌβββββββΌβββββββββΌββββββββββΌβββββββββΌββββββββΌββββββββββββΌβββββββββΌβββββββββββ€ β api β 0 β fork β 3690 β online β 0 β 11s β 0% β 85.2 MB β ubuntu β disabled β β o2m β 1 β fork β 3696 β online β 0 β 11s β 0% β 48.4 MB β ubuntu β disabled β β server β 2 β cluster β 3763 β online β 0 β 0s β 26.7% β 66.9 MB β ubuntu β disabled β β server β 3 β cluster β 3770 β online β 0 β 0s β 0% β 68.1 MB β ubuntu β disabled β β server β 4 β cluster β 3785 β online β 0 β 0s β 0% β 40.9 MB β ubuntu β disabled β β server β 5 β cluster β 3796 β online β 0 β 0s β 0% β 40.9 MB β ubuntu β disabled β ββββββββββββ΄βββββ΄ββββββββββ΄βββββββ΄βββββββββ΄ββββββββββ΄βββββββββ΄ββββββββ΄ββββββββββββ΄βββββββββ΄βββββββββββ Use `pm2 show <id|name>` to get more details about an app Done in 1.49s.
pid β Status β Neustart β uptime β cpu β mem β Benutzer β beobachten β $ cd ~/vue-storefront-api $ yarn start ... $ cd ~/vue-storefront $ yarn start ... [PM2][WARN] Applications server not running, starting... [PM2] App [server] launched (4 instances) ββββββββββββ¬βββββ¬ββββββββββ¬βββββββ¬βββββββββ¬ββββββββββ¬βββββββββ¬ββββββββ¬ββββββββββββ¬βββββββββ¬βββββββββββ β App name β id β mode β pid β status β restart β uptime β cpu β mem β user β watching β ββββββββββββΌβββββΌββββββββββΌβββββββΌβββββββββΌββββββββββΌβββββββββΌββββββββΌββββββββββββΌβββββββββΌβββββββββββ€ β api β 0 β fork β 3690 β online β 0 β 11s β 0% β 85.2 MB β ubuntu β disabled β β o2m β 1 β fork β 3696 β online β 0 β 11s β 0% β 48.4 MB β ubuntu β disabled β β server β 2 β cluster β 3763 β online β 0 β 0s β 26.7% β 66.9 MB β ubuntu β disabled β β server β 3 β cluster β 3770 β online β 0 β 0s β 0% β 68.1 MB β ubuntu β disabled β β server β 4 β cluster β 3785 β online β 0 β 0s β 0% β 40.9 MB β ubuntu β disabled β β server β 5 β cluster β 3796 β online β 0 β 0s β 0% β 40.9 MB β ubuntu β disabled β ββββββββββββ΄βββββ΄ββββββββββ΄βββββββ΄βββββββββ΄ββββββββββ΄βββββββββ΄ββββββββ΄ββββββββββββ΄βββββββββ΄βββββββββββ Use `pm2 show <id|name>` to get more details about an app Done in 1.49s.
Haltestelle:
$ pm2 stop all
Protokolle anzeigen:
$ pm2 log
Anwendungsverbindung
Anwendungsadresse: http://194.182.181.149//000/ Infolgedessen wird ganz am Anfang eine Fehlermeldung im Browser angezeigt. In den Protokollen des API-Servers kΓΆnnen jedoch Browser-Aufrufe an die API aufgezeichnet werden:
$ pm2 log 3|server | 2019-11-16 07:44:33: Error during render : / 3|server | 2019-11-16 07:44:33: Error: FetchError in request to ES: FetchError: invalid json response body at http://194.182.181.149:8080/api/catalog/vue_storefront_catalog/product/_search?_source_exclude=%2A.msrp_display_actual_price_type%2Crequired_options%2Cupdated_at%2Ccreated_at%2Cattribute_set_id%2Coptions_container%2Cmsrp_display_actual_price_type%2Chas_options%2Cstock.manage_stock%2Cstock.use_config_min_qty%2Cstock.use_config_notify_stock_qty%2Cstock.stock_id%2Cstock.use_config_backorders%2Cstock.use_config_enable_qty_inc%2Cstock.enable_qty_increments%2Cstock.use_config_manage_stock%2Cstock.use_config_min_sale_qty%2Cstock.notify_stock_qty%2Cstock.use_config_max_sale_qty%2Cstock.use_config_max_sale_qty%2Cstock.qty_increments%2Csmall_image%2Csgn%2C%2A.sgn&from=0&request=%7B%22query%22%3A%7B%22bool%22%3A%7B%22filter%22%3A%7B%22bool%22%3A%7B%22must%22%3A%5B%7B%22terms%22%3A%7B%22category.name.keyword%22%3A%5B%22Tees%22%5D%7D%7D%2C%7B%22terms%22%3A%7B%22visibility%22%3A%5B2%2C3%2C4%5D%7D%7D%2C%7B%22terms%22%3A%7B%22status%22%3A%5B0%2C1%5D%7D%7D%5D%7D%7D%7D%7D%7D&size=8&sort=created_at%3Adesc reason: Unexpected end of JSON input 3|server | at w (core/server-entry.ts:23:25) 3|server | at server-bundle.js:1:468554 3|server | at processTicksAndRejections (internal/process/task_queues.js:93:5) 3|server | 2019-11-16 07:44:33: whole request [/error]: 56ms 0|api | 2019-11-16 07:44:34: OPTIONS /api/cart/create?token= 204 1.320 ms - 0 0|api | 2019-11-16 07:44:34: POST /api/cart/create?token= 200 465.416 ms - 56 0|api | 2019-11-16 07:44:34: OPTIONS /api/cart/pull?token=&cartId=35bea3b7dcf8fb841187d69489fe8c51 204 0.239 ms - 0 0|api | 2019-11-16 07:44:34: GET /api/cart/pull?token=&cartId=35bea3b7dcf8fb841187d69489fe8c51 200 103.949 ms - 24
2Cattribute_set_id% 2Coptions_container% 2Cmsrp_display_actual_price_type% 2Chas_options% 2Cstock.manage_stock% 2Cstock.use_config_min_qty% 2Cstock.use_config_notify_stock_qty% 2Cstock.stock_id% 2Cstock.use_config_backorders% 2Cstock.use_config_enable_qty_inc% 2Cstock.enable_qty_increments% 2Cstock.use_config_manage_stock% 2Cstock $ pm2 log 3|server | 2019-11-16 07:44:33: Error during render : / 3|server | 2019-11-16 07:44:33: Error: FetchError in request to ES: FetchError: invalid json response body at http://194.182.181.149:8080/api/catalog/vue_storefront_catalog/product/_search?_source_exclude=%2A.msrp_display_actual_price_type%2Crequired_options%2Cupdated_at%2Ccreated_at%2Cattribute_set_id%2Coptions_container%2Cmsrp_display_actual_price_type%2Chas_options%2Cstock.manage_stock%2Cstock.use_config_min_qty%2Cstock.use_config_notify_stock_qty%2Cstock.stock_id%2Cstock.use_config_backorders%2Cstock.use_config_enable_qty_inc%2Cstock.enable_qty_increments%2Cstock.use_config_manage_stock%2Cstock.use_config_min_sale_qty%2Cstock.notify_stock_qty%2Cstock.use_config_max_sale_qty%2Cstock.use_config_max_sale_qty%2Cstock.qty_increments%2Csmall_image%2Csgn%2C%2A.sgn&from=0&request=%7B%22query%22%3A%7B%22bool%22%3A%7B%22filter%22%3A%7B%22bool%22%3A%7B%22must%22%3A%5B%7B%22terms%22%3A%7B%22category.name.keyword%22%3A%5B%22Tees%22%5D%7D%7D%2C%7B%22terms%22%3A%7B%22visibility%22%3A%5B2%2C3%2C4%5D%7D%7D%2C%7B%22terms%22%3A%7B%22status%22%3A%5B0%2C1%5D%7D%7D%5D%7D%7D%7D%7D%7D&size=8&sort=created_at%3Adesc reason: Unexpected end of JSON input 3|server | at w (core/server-entry.ts:23:25) 3|server | at server-bundle.js:1:468554 3|server | at processTicksAndRejections (internal/process/task_queues.js:93:5) 3|server | 2019-11-16 07:44:33: whole request [/error]: 56ms 0|api | 2019-11-16 07:44:34: OPTIONS /api/cart/create?token= 204 1.320 ms - 0 0|api | 2019-11-16 07:44:34: POST /api/cart/create?token= 200 465.416 ms - 56 0|api | 2019-11-16 07:44:34: OPTIONS /api/cart/pull?token=&cartId=35bea3b7dcf8fb841187d69489fe8c51 204 0.239 ms - 0 0|api | 2019-11-16 07:44:34: GET /api/cart/pull?token=&cartId=35bea3b7dcf8fb841187d69489fe8c51 200 103.949 ms - 24
2Cstock.qty_increments% 2Csmall_image% 2Csgn% 2C% 2A.sgn & from = $ pm2 log 3|server | 2019-11-16 07:44:33: Error during render : / 3|server | 2019-11-16 07:44:33: Error: FetchError in request to ES: FetchError: invalid json response body at http://194.182.181.149:8080/api/catalog/vue_storefront_catalog/product/_search?_source_exclude=%2A.msrp_display_actual_price_type%2Crequired_options%2Cupdated_at%2Ccreated_at%2Cattribute_set_id%2Coptions_container%2Cmsrp_display_actual_price_type%2Chas_options%2Cstock.manage_stock%2Cstock.use_config_min_qty%2Cstock.use_config_notify_stock_qty%2Cstock.stock_id%2Cstock.use_config_backorders%2Cstock.use_config_enable_qty_inc%2Cstock.enable_qty_increments%2Cstock.use_config_manage_stock%2Cstock.use_config_min_sale_qty%2Cstock.notify_stock_qty%2Cstock.use_config_max_sale_qty%2Cstock.use_config_max_sale_qty%2Cstock.qty_increments%2Csmall_image%2Csgn%2C%2A.sgn&from=0&request=%7B%22query%22%3A%7B%22bool%22%3A%7B%22filter%22%3A%7B%22bool%22%3A%7B%22must%22%3A%5B%7B%22terms%22%3A%7B%22category.name.keyword%22%3A%5B%22Tees%22%5D%7D%7D%2C%7B%22terms%22%3A%7B%22visibility%22%3A%5B2%2C3%2C4%5D%7D%7D%2C%7B%22terms%22%3A%7B%22status%22%3A%5B0%2C1%5D%7D%7D%5D%7D%7D%7D%7D%7D&size=8&sort=created_at%3Adesc reason: Unexpected end of JSON input 3|server | at w (core/server-entry.ts:23:25) 3|server | at server-bundle.js:1:468554 3|server | at processTicksAndRejections (internal/process/task_queues.js:93:5) 3|server | 2019-11-16 07:44:33: whole request [/error]: 56ms 0|api | 2019-11-16 07:44:34: OPTIONS /api/cart/create?token= 204 1.320 ms - 0 0|api | 2019-11-16 07:44:34: POST /api/cart/create?token= 200 465.416 ms - 56 0|api | 2019-11-16 07:44:34: OPTIONS /api/cart/pull?token=&cartId=35bea3b7dcf8fb841187d69489fe8c51 204 0.239 ms - 0 0|api | 2019-11-16 07:44:34: GET /api/cart/pull?token=&cartId=35bea3b7dcf8fb841187d69489fe8c51 200 103.949 ms - 24
Fazit
Es ist gelungen, einen Schritt weiter zu gehen - Vue Storefront PWA kommuniziert mit der Vue Storefront-API. Als nΓ€chstes mΓΌssen Sie sich mit dem Inhalt des Backends befassen. Welche Daten werden in Elasticsearch indiziert, wie gelangen sie dorthin und wie werden sie abgerufen?
Vielen Dank fΓΌr das Lesen und klicken Sie auf meinen Empfehlungslink. Verdammt noch mal, um ihretwillen hat sich hier all das angesammelt.