{"id":3586,"date":"2018-10-10T21:20:09","date_gmt":"2018-10-10T19:20:09","guid":{"rendered":"https:\/\/moe.it.slotshaven.dk\/wp\/?p=3586"},"modified":"2018-10-10T21:20:09","modified_gmt":"2018-10-10T19:20:09","slug":"express-js","status":"publish","type":"post","link":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/express-js\/","title":{"rendered":"2 npm"},"content":{"rendered":"<p>Okay, s\u00e5 vi har installeret node &#8211; og vi har fundet ud af at vi kan k\u00f8re en server via kommandoprompten &#8211; og starte en fil vi selv har lavet: server.js. Og det er jo super.<\/p>\n<p>Men p\u00e5 en m\u00e5de fik vi ikke helt afsluttet hvad en webserver er. Normalt &#8211; og ogs\u00e5 i dette tilf\u00e6lde &#8211; er en webserver en computer (med en adresse p\u00e5 internettet), hvorp\u00e5 man kan tilg\u00e5 websider med en klient\/browser. Udover at agere socket, er <em>node<\/em> alts\u00e5 ogs\u00e5 ansvarlig for &#8211; helt basic &#8211; at hoste og servere\/vise javascript og html filer.<\/p>\n<p>Det kaldes en server af samme grund, <em>node<\/em> kaldes en service.\u00a0Servere har alts\u00e5 services &#8211; programmer som er klar til at svare p\u00e5 foresp\u00f8rgsler fra klienter. Helt konkret som fx i en browser: Brugeren udfylder en url, som peger direkte p\u00e5 den server man vil have svar fra, og (via en eller anden protokol) giver serveren data tilbage. Ofte i form af html, javascript og css filer som vi kender det, men i virkeligheden lige s\u00e5 ofte i form af alle mulige andre data og filer.<\/p>\n<p>[otw_shortcode_info_box border_type=&#8221;bordered&#8221; border_style=&#8221;bordered&#8221; shadow=&#8221;shadow-outer&#8221; ]<\/p>\n<p>Node hedder faktisk node.js, men der er ikke tale om en javascript fil selvom navnet antyder det. Node er et s\u00e5kaldt\u00a0<em>runtime<\/em> milj\u00f8, en slags protokol p\u00e5 serveren, som hele tiden lytter efter klienters javascriptbaserede interaktion. Man kan ogs\u00e5 simpelthen kalde node en <strong>webserver<\/strong>. Men det er vigtigt at bem\u00e6rke at node er en webserver, der k\u00f8rer og forst\u00e5r javascript.<\/p>\n<p>[\/otw_shortcode_info_box]<\/p>\n<p>Node er en webserver, og det s\u00e6rlige form\u00e5l med node er f\u00f8lgende: Normalt kender vi javascript som koder der sendes fra server til klient, og som afvikles p\u00e5 den computer som bruger browseren. Det giver et ekstra led: n\u00e5r man vil kommunikere med serveren via javascript, m\u00e5 man hele tiden opdatere browsersiden for at sende data frem og tilbage. <strong>Fordi alt javascript afvikles p\u00e5 klienten.<\/strong> N\u00e5r serveren k\u00f8rer <em>node, <\/em>afvikles javascript\u00a0<em>b\u00e5de<\/em> p\u00e5 klienten og serveren, og dermed har man helt andre muligheder for at kommunikere i realtid.<\/p>\n<h2>Npm<\/h2>\n<p>Ligesom andre programmerings milj\u00f8er, har node (og i det hele taget javascript) en masse udvidelser og pakker der ikke f\u00f8lger med i core-versionen. Hvis man vil have tilgang til s\u00e6rlige funktioner (kaldet pakker eller biblioteker), downloades og k\u00f8res de &#8211; ligesom node &#8211; via et terminalvindue.<\/p>\n<p>Npm er en s\u00e5kaldt <em>pakkemanager<\/em> for javascript. Et lille programmeringssprog hvis eneste form\u00e5l er at hente og opdatere udvidelser til javascript projekter. Lad os pr\u00f8ve at bruge npm i praksis ved at g\u00e5 ind i terminalen &#8211; i det projekt vi arbejder p\u00e5 &#8211; og skrive f\u00f8lgende:<\/p>\n<pre>npm init\n<\/pre>\n<p>Nu sker der en masse &#8211; kort fortalt bliver vi guidet igennem en slags ops\u00e6tning af node webserveren. Npm init konfigurerer node projektet: Hvilke biblioteker og pakker skal kunne tilg\u00e5s, hvilken version osv.<\/p>\n<p>[otw_shortcode_info_box border_type=&#8221;bordered&#8221; border_style=&#8221;bordered&#8221; shadow=&#8221;shadow-outer&#8221;]<\/p>\n<p>By the way, npm kommer normalt med node &#8211; men skulle du ikke have f\u00e5et installeret npm (s\u00e5 virker npm init jo ikke), <a href=\"https:\/\/www.npmjs.com\/get-npm\">s\u00e5 l\u00e6s og installer her<\/a>.<\/p>\n<p>[\/otw_shortcode_info_box]<\/p>\n<p>Det kan virke\u00a0<em>noget\u00a0<\/em>komplekst &#8211; det\u00a0<strong>er\u00a0<\/strong>komplekst &#8211; at vi skal lave en konfigurationsfil f\u00f8r vi overhovedet har skrevet en eneste linje kode. Men b\u00e6r over med kompleksiteten og f\u00f8lg forel\u00f8big bare med i dette indledende eksempel. Har du f\u00f8rst forst\u00e5et hvordan <strong>node.js<\/strong> s\u00e6ttes op og bruges med <strong>npm<\/strong>, er du i gang med at give dine webprojekter superkr\u00e6fter, og mulighederne herefter er talrige.<\/p>\n<p>Vi f\u00e5r i sidste linje at vide, at vores projekt har et navn: sockets_1 &#8211; fint. [enter]. Derefter:<\/p>\n<pre>version: 1.0.0 [enter]\ndescription: Projekt der illustrerer ops\u00e6tning af node sockets \nentry point: (sketch.js) server.js\ntest command: \ngit repository: \nkeywords: Javascript, Sockets, Node.js\nauthor: Dig Svendsen\nlicense: (ISC) \nAbout to write to \/Users\/simon\/Git\/digidaktik\/sockets\/sockets_1\/package.json:\n\n{\n  \"name\": \"sockets_1\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Projekt der illustrerer ops\u00e6tning af node sockets \",\n  \"main\": \"server.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" &amp;&amp; exit 1\",\n    \"start\": \"node server.js\"\n  },\n  \"keywords\": [\n    \"Javascript\",\n    \"Sockets\",\n    \"Node.js\"\n  ],\n  \"author\": \"Dig Svendsen\",\n  \"license\": \"ISC\"\n}\n\n\nIs this ok? (yes) yes\nSimons-MacBook-Pro:sockets_1 sim$ \n<\/pre>\n<p>OK -s\u00e5 det der skete her var &#8211; og det kan ogs\u00e5 se i filmappen til projektet &#8211; at der blev lavet en ny fil: package.json. Vi skal ikke d\u00e6kke json formatet her, lad os blot sige at det er en struktureret m\u00e5de at s\u00e6tte data op p\u00e5. Hvis vi \u00e5bner filen, kan vi se at indholdet er n\u00f8jagtig det som npm foreslog til sidst. Projektet har nu en konfigurationsfil &#8211; package.json &#8211; der indeholder en masse metaoplysninger om det: hvem har lavet det, hvilken version er det osv &#8211; og ikke mindst: hvilke eksterne pakker skal projektet have adgang til.<\/p>\n<h2>Express package<\/h2>\n<p>Express er en pakke der udvider nodes funktionalitet. Vi skal bruge den i praksis om lidt &#8211; men f\u00f8rst m\u00e5 vi importere pakken til projektet. Der skal alts\u00e5 st\u00e5 et eller andet sted i package.json, at projektet er afh\u00e6ngigt (engelsk: dependencies) af pakken express. S\u00e5 lad os se hvordan man bruger npm til at installere\u00a0<em>express\u00a0<\/em>og samidig skrive i package.json at projektet bruger pakken:<\/p>\n<pre>npm install express --save\nnpm notice created a lockfile as package-lock.json. You should commit this file.\nnpm WARN sockets_1@1.0.0 No repository field.\n\n+ express@4.16.4\nadded 48 packages in 2.878s\nSimons-MacBook-Pro:sockets_1 sim$ \n<\/pre>\n<p>-hvor &#8211;save kort sagt betyder, at vi udover at installere pakken p\u00e5 systemet, ogs\u00e5 vil bruge den i det specifikke projekt. Og se engang i filen package.json. Der er nu kommet en pind ved navn dependencies &#8211; og her ser vi at express pakken er taget med.<\/p>\n<p>Du vil ogs\u00e5 bem\u00e6rke at selve mappen med projektet nu har en ny folder: node_modules. I denne mappe ligger express pakken\u00a0 fysisk, det er her projektet finder sine udvidelser (ligesom vi kender det fra vores egne javascript projekter).<\/p>\n<h2>Tilbage til server.js<\/h2>\n<p>Godt! (og ja, det er indtil nu noget af det mest kedsommelige og dr\u00e6vne vi l\u00e6nge har foretaget os), nu er vi omsider klar til at skrive noget kode. N\u00e6rmere bestemt vil vi skrive den javascript kode, som skal ligge p\u00e5 vores server. Indtil nu er filen tom, bortset fra vores debug statement.<\/p>\n<div>Vi skal nu skrive den kode, som g\u00f8r det muligt for programmet at agere webserver for vores p5 projekt.<\/div>\n<pre>\/\/ Vi bruger pakken express: http:\/\/expressjs.com\/\nvar express = require('express');<\/pre>\n<pre>\/\/ Vi laver en variabel - app - som instantierer et express objekt:\nvar app = express();<\/pre>\n<pre>\/\/ Vi laver en variabel - server - som lytter efter klienter p\u00e5 port 3000\nvar server = app.listen(3000);<\/pre>\n<p>Vi opretter f\u00f8rst en variabel (express) som importerer express-pakken. Bagefter laver vi en instans af dette objekt i variable &#8220;app&#8221;. Endelig laver vi et konkret server objekt som lytter p\u00e5 port 3000.<\/p>\n<p>Det <em>kunne<\/em> have v\u00e6ret en mere interessant server end bare port 3000 p\u00e5 denne maskine &#8211; det kunne . have v\u00e6ret p\u00e5 dr.dk, viaplay.com &#8211; you name it.. men vi har startet en webserver, og det er da noget.<\/p>\n<p>Men okay serveren svarer stadig m\u00e6rkeligt &#8211; kig i browseren:<\/p>\n<pre>Cannot GET \/<\/pre>\n<p>Det som serveren siger, er egentlig bare at den ikke ved hvad den skal g\u00f8re. Der er ingen instruktioner, ingen filer eller kald den bliver bedt om at tage sig af, s\u00e5 den kaster en fejlmeddelelse.<\/p>\n<h2>Lad os hoste nogle filer<\/h2>\n<p>S\u00e5 hvad er det vi vil have skal ske? Jo, den absolut vigtigste funktion for webserveren &#8211; i dette projekt &#8211; skal jo v\u00e6re at vise vores p5.js sketch. Lad os lige omrokere filerne i projektmappen lidt &#8211; vi laver en folder der hedder &#8220;public&#8221;, og flytter alle de p5 relaterede filer over i den mappe:<\/p>\n<h3>F\u00f8r<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3593\" src=\"https:\/\/moe.it.slotshaven.dk\/wp\/wp-content\/uploads\/2018\/10\/1.jpeg\" alt=\"\" width=\"418\" height=\"322\" \/><\/p>\n<h3>Efter&#8230;<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-3594\" src=\"https:\/\/moe.it.slotshaven.dk\/wp\/wp-content\/uploads\/2018\/10\/2.jpeg\" alt=\"\" width=\"816\" height=\"462\" \/><\/p>\n<p>Mappen &#8220;public&#8221; indeholder de filer vi vil have webserveren til at vise udadtil. Vi vil ikke vise alle og enhver vores serverside scripts &#8211; det ville v\u00e6re\u00a0 t\u00e5beligt &#8211; men vi vil netop have at webserveren skal k\u00f8re og vise vores javascript projekt i p5. Tilf\u00f8j derefter denne kodelinje til server.js:<\/p>\n<div>\n<pre>\/\/ Vis de statiske filer i mappen public, n\u00e5r der kommer en klient \napp.use(express.static('public'));<\/pre>\n<\/div>\n<p>Det som den linje betyder er, at app&#8217;en skal bruge filerne i &#8220;public&#8221; mappen som statiske filer der fremvises til klienter. Og hvis vi nu gemmer server.js og genstarter den med node, kan vi se at browservinduet holder op med at give en fejl. I stedet kan vi se javascriptet fra sketch.js. Jep.<\/p>\n<p>[otw_shortcode_info_box border_type=&#8221;bordered&#8221; border_style=&#8221;bordered&#8221; shadow=&#8221;shadow-outer&#8221;]Vi kan lynhurtigt g\u00f8re websiden mere interessant ved faktisk at skrive noget javascript i sketch.js. For eksempel noget standardkode, som f\u00e5r musen til at vise en cirkel..[\/otw_shortcode_info_box]<\/p>\n<h2>Opsamling<\/h2>\n<p>Nu\u00a0 ved du hvordan man starter en webserver p\u00e5 sin egen computer, og vi kan rent faktisk se at den k\u00f8rer ved at skrive localhost:3000 &#8211; i browseren. Den viser de filer vi har bedt den om, og det fungerer. Det n\u00e6ste vi skal g\u00f8re, er at lave sockets &#8211; som g\u00f8r det muligt for klienter at sende beskeder frem og tilbage fra serveren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Okay, s\u00e5 vi har installeret node &#8211; og vi har fundet ud af at vi kan k\u00f8re en server via kommandoprompten &#8211; og starte en fil vi selv har lavet: server.js. Og det er jo super. Men p\u00e5 en m\u00e5de fik vi ikke helt afsluttet hvad en webserver er. Normalt &#8211; og ogs\u00e5 i dette &#8230; <a title=\"2 npm\" class=\"read-more\" href=\"https:\/\/digitalteknik.slotshaven.it\/wordpress\/express-js\/\" aria-label=\"Read more about 2 npm\">L\u00e6s mere <\/a><\/p>\n","protected":false},"author":3,"featured_media":3600,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[39],"class_list":["post-3586","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-den-fysiske-verden","tag-sockets"],"_links":{"self":[{"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/posts\/3586","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3586"}],"version-history":[{"count":0,"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/posts\/3586\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/"}],"wp:attachment":[{"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalteknik.slotshaven.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}