Du er en PHP-udvikler. Jeg forstår det godt. Det er jeg også. Min rejse til PHP gik ikke ad den normale vej, som de fleste PHP-udviklere tager i deres søgen efter det perfekte programmeringssprog. Jeg startede oprindeligt som Java-udvikler og tilbragte ca. 10 år i det land. Jeg var en af de hårdkogte Java-udviklere, som når PHP blev introduceret i en samtale, begyndte jeg at udbryde ting som enterprise, skalerbarhed og andet nonsens.

Jeg begyndte at arbejde på et open source-projekt, der havde brug for en social web-front-end for ca. 5 år siden, og holdet skulle vælge et programmeringssprog til webstedet. Jeg udforskede Java og de fleste andre sprog, men besluttede mig for PHP af en række årsager. Det var svært at sluge min stolthed og begynde at programmere i PHP, men det, der skete i løbet af det projekt, var intet mindre end et mirakel. Jeg blev forelsket i sproget og begyndte at bruge det til så mange projekter, som jeg kunne finde, mens jeg lod mine Java-rødder ligge i støvet. PHP har tjent mig godt i de sidste 5 år, men jeg ledte stadig efter den hellige gral af et programmeringssprog, der er hurtigt at udvikle i, har opbakning fra virksomheder, er performant og skalerbart og samtidig har et stærkt fællesskab af udviklere. Jeg mener, at Node.js opfylder alle mine krav, samtidig med at det stadig er et sprog i hurtig vækst og udvikling.

Den første ting, du skal forstå, er, at Node.js ikke kun er for hipster-udviklere eller early adopters. Det er i brug af nogle af de mest trafikerede websteder på internettet i dag og fortsætter med at vinde udviklernes hjerter og sind. Det er virkelig på et punkt, hvor du kan stole på det til selv de mest komplicerede systemer.

Node.js er JavaScript##

Hvis du tænker, at du skal lære et helt nyt sprog for at være produktiv med Node.js, tager du nok fejl. De fleste udviklere er allerede fortrolige med JavaScript, og det er det sprog og den semantik, som du vil arbejde med, når du koder i Node.js. Faktisk har en nylig artikel offentliggjort af Red Monk, der forsøger at skabe mening i github-projekter for at bestemme de mest populære sprog, JavaScript som konge. De tre bedste sprog er som følger:

  • JavaScript
  • Java
  • PHP

Givet JavaScript’s popularitet og dets udbredte anvendelse i hele vores branche, er det nok på tide at spænde livremmen og begynde at lære det, hvis du ikke allerede er bekendt med det, hvis du ikke allerede er bekendt med det.

Hvis Node.js bare bruger JavaScript, hvad er det så helt præcist?##

I en nøddeskal er Node.js en platform for aktiviteter på serversiden. Den bruger programmeringssproget Javascript og har et væld af biblioteker, der er tilgængelige som npm-moduler. Du kan tænke på disse npm-moduler som biblioteksafhængigheder, der kan opfyldes med Composer, hvis du kommer fra PHP-land. Faktisk er standardstyringssystemet til håndtering af afhængigheder i PHP (Composer) inspireret af Node.js ifølge det officielle websted. Chancerne er, at hvis du har brug for en smule funktionalitet og ikke har lyst til at skrive al koden selv, er der et npm-modul til rådighed, der allerede giver de funktioner, du leder efter.

Node-applikationer implementeres normalt, når du har brug for at maksimere effektiviteten ved at udnytte non-blocking I/O og asynkrone begivenheder. Et problem for PHP-udviklere, som de skal vide, er, at Node.js-applikationer kører i en enkelt tråd. Backend Node.js-kode bruger dog flere tråde til operationer som f.eks. netværks- og filadgang. På baggrund af dette er Node perfekt til applikationer, hvor der ønskes en næsten realtidsoplevelse.

Gå i gang med et eksempelprojekt###

I resten af dette blogindlæg vil jeg vise dig, hvordan du kommer i gang med Node.js fra en PHP-baggrund. Den prøveapplikation, som vi vil skrive, er en simpel backend-tjeneste, der vil give dig placeringen af alle Walmart-butikker. Jeg valgte Walmart til dette eksempel, fordi det ganske enkelt er den hellige gral for alle stormagasiner. Hvis Walmart ikke har det, har du ikke brug for det.

Ved slutningen af dette blogindlæg vil du se, hvor hurtigt og nemt det er at oprette et REST-baseret API ved hjælp af Node.js, der er drevet af den populære MongoDB-database. Jeg valgte dette REST-baserede eksempel, fordi det at skabe et backend-API hurtigt er blevet en almindelig use case i de fleste moderne applikationer.

Jeg havde oprindeligt planlagt at oprette den samme applikation i både PHP og Node.js for at lette overgangen for dig, men for at dække alle de forskellige frameworks og måder at skabe REST-baserede tjenester i PHP på, ville det berettige en hel bog, og det kan simpelthen ikke dækkes i et enkelt blogindlæg. Jeg tænkte så på bare at bruge Laravel-rammen, da den fortsat vokser i popularitet. Jeg ville dog stadig kun nå ud til en fjerdedel af PHP-udviklerne. Personligt er mit foretrukne framework CodeIgniter, men det er hurtigt ved at tabe terræn og repræsenterer nu kun mindre end 8 % af PHP-udviklerpopulationen. Sitepoint offentliggjorde for nylig en artikel, der diskuterer netop dette og giver følgende diagram, der skildrer de frameworks, der viser det mest lovende for 2014.

Givet de store forskelle i, hvordan man konfigurerer databaseforbindelser og opretter REST-tjenester for hvert framework, vil jeg antage, at du ved, hvordan du gør dette for dit framework i PHP, og i stedet vil jeg kun fokusere på Node.js-kode.

Skabelse af vores Node.js-applikation###

I resten af dette indlæg vil vi oprette Walmart-lokaliseringsapplikationen ved hjælp af LoopBack API-rammen fra StrongLoop. Som en ekstra bonus vil jeg gå dig gennem installation af Node.js på OSX. Så tag din kop kaffe, læn dig tilbage, slap af, og lad os komme i gang.

Stræk 1: Installation af Node.js###

Den nemmeste måde at installere Node.js på er via en af de tilgængelige binære pakker, der er tilgængelige for de fleste operativsystemer. Peg din browser til følgende URL og download den korrekte til dit operativsystem:

http://nodejs.org/download/

Når denne side er indlæst, bør du se følgende:

Hvis du bruger Mac OSX, skal du klikke på den universelle .pkg-fil. Dette vil gemme installationsprogrammet på din lokale computer. Når filen er blevet downloadet, skal du starte installationsprogrammet ved at dobbeltklikke på den .pkg-fil, der er blevet downloadet, og du vil få vist installationsdialogboksen:

Fuldfør installationsprocessen ved at bruge alle standardindstillingerne, og klik til sidst på lukkeknappen for at afslutte programmet, når installationen er lykkedes. Ret nemt, ikke sandt?

Stræk 2: Installation af LoopBack med NPM

Nu da vi har Node.js installeret på vores lokale system, vil vi installere LoopBack-pakkerne, som leveres af StrongLoop. LoopBack er en open source API-ramme, der tilbyder funktionalitet, som vil gøre dit liv lettere, når du begynder at lære at skrive og implementere software skrevet i Node.js.

For at installere LoopBack vil vi bruge kommandoen npm, som er en del af Node.js-kernedistributionen. NPM er den officielle pakkehåndtering til installation af biblioteker eller moduler, som dine programmer er afhængige af. Da dette indlæg er skrevet til PHP-udviklere, er en nem måde at tænke på NPM-moduler på at relatere det til Composer. Ved hjælp af Composer-dependencies-systemet kan udviklere angive afhængigheder i deres composer.json-fil. Når pakkerne er blevet defineret i composer.json-filen, skal en PHP-udvikler blot afgive kommandoen install, som bør ligne følgende:

$ php composer.phar install

NPM-moduler fungerer på samme måde og bruger filen package.json til at give dig mulighed for at angive afhængigheder for et bestemt program. Du kan også installere afhængigheder fra kommandolinjen for at gøre dem tilgængelige på dit lokale system. Du skal ikke bekymre dig, hvis du ikke forstår dette endnu, da vi vil gennemgå package.json-filen mere detaljeret i et senere trin.

For at installere LoopBack kan vi sende en enkelt kommando, der henter og installerer alle de afhængigheder, vi har brug for til pakken. Åbn dit terminalvindue, og udfør følgende kommando:

$ npm install -g strongloop

Note: Du skal muligvis bruge sudo afhængigt af din installation

Hvad skete der lige? Vi fortalte npm, at vi ønsker at installere strongloop-pakken, mens vi også gav -g indstillingen. Indstillingen -g gør pakken tilgængelig som en global pakke, så alle på systemet kan bruge den, og den er tilgængelig for alle programmer. Når du kører ovenstående kommando, henter NPM pakken samt eventuelle afhængigheder, der er nødvendige. Afhængigt af hastigheden på dit system kan det tage et par minutter at gennemføre.

Stræk 3: Oprettelse af vores applikation##

Det er meget nemt og ligetil at oprette en applikation ved hjælp af LoopBack API’en. Du skal blot åbne dit terminalvindue og sende følgende kommando for at oprette et nyt program kaldet locatewalmart.

$ slc loopback _-----_ | | .--------------------------. |--(o)--| | Let's create a LoopBack | `---------´ | application! | ( _´U`_ ) '--------------------------' /___A___\ | ~ | __'.___.'__ ´ ` |° ´ Y ` Enter a directory name where to create the project: locatewalmart create locatewalmart/ info change the working directory to locatewalmart

Det slc hjælpeprogram vil nu oprette et nyt LoopBack-baseret projekt kaldet locatewalmart og konfigurere projektet. Når vi bliver bedt om at angive programnavnet, kan vi beholde standardværdien.

What's the name of your application? locatewalmart

Når du har kørt ovenstående kommando, vil der blive oprettet en ny mappe til dit projekt til dit program. Skift til applikationsmappen med cd-kommandoen:

$ cd locatewalmart

Nu da vi har oprettet vores applikation, vil vi tilføje understøttelse af MongoDB som en datakilde til loopback.

Stræk 4: Definering af vores datakilde###

For at kunne kommunikere med MongoDB skal vi tilføje en datakilde til vores applikation. Det gør vi ved at køre:

$ slc loopback:datasource mymongo Enter the data-source name: mymongo Select the connector for mymongo:PostgreSQL (supported by StrongLoop)Oracle (supported by StrongLoop)Microsoft SQL (supported by StrongLoop)❯ MongoDB (supported by StrongLoop)SOAP webservices (supported by StrongLoop)REST services (supported by StrongLoop)Neo4j (provided by community)(Move up and down to reveal more choices)

Stræk 5: Pege på den rigtige datasource###

For at kunne kommunikere med MongoDB skal vi pege datasource på den faktiske MongoDB-instans. LoopBack definerer al konfiguration af datasource i filen datasource.json, der ligger i mappen root/server i dit program root/server. Åbn denne fil, og tilføj en datakilde til MongoDB som vist i følgende kode:

{ "db": { "name": "db", "connector": "memory" }, "mymongo": { "name": "mymongo", "connector": "mongodb" "url": "mongodb://localhost:27017/locatewalmart" }}

Bemærk: Sørg for at angive den korrekte forbindelses-URL for din MongoDB-database. I dette eksempel har jeg oprettet en database lokalt kaldet locatewalmart, som jeg vil bruge til min datakilde.

Nu hvor vi har defineret vores database, er der et par ekstra ting, vi skal gøre. Først og fremmest skal vi angive, at vores programmer afhænger af pakken loopback-connector-mongodb. For at angive en afhængighed skal du ændre filen package.json, hvilket svarer til at redigere filen composer.json i PHP. Åbn package.json-filen, der ligger i rodmappen for din applikation, og tilføj loopback-connector-mongodb til afsnittet om afhængighed. Herefter kan du køre npm install.

Alternativt kan du bare køre:

$ npm install loopback-connector-mongodb --save

Dette vil automatisk opdatere package.json. Afsnittet bør se ud som følger:

"dependencies": { "compression": "^1.0.3", "errorhandler": "^1.1.1", "loopback": "^2.0.0", "loopback-boot": "^2.0.0", "loopback-connector-mongodb": "^1.4.1", "loopback-datasource-juggler": "^2.0.0", "serve-favicon": "^2.0.1" }

Stræk 6: Import af data til MongoDB##

Nu hvor vi har konfigureret vores datakilde, skal vi indlæse datasættet i vores MongoDB-database.

Den første ting, vi vil gøre, er at hente en JSON-fil, der har alle de data, vi ønsker at returnere. Du kan hente den på følgende URL:

https://dl.dropboxusercontent.com/u/72466829/walmart.json

Når du har downloadet datasættet, skal du blot importere det til din database ved hjælp af kommandoen mongoimport som vist nedenfor:

$ mongoimport --jsonArray -d locatewalmart -c store --type json --file walmart.json -h yourMongoHost --port yourMongoPort -u yourMongoUsername -p yourMongoPassword

Du bør se følgende resultater:

connected to: 127.0.0.12014-08-17T13:07:26.301-0400 check 9 31762014-08-17T13:07:26.305-0400 imported 3176 objects

Stræk 7: Oprettelse af vores Store model##

En model kan tænkes på samme måde, som du tænker på modeller i PHP-land, hvis du bruger en MVC-ramme. Det er en repræsentation af et objekt, som i dette tilfælde er en Walmart-butik. LoopBack giver en bekvem måde at oprette modelobjekter på ved hjælp af kommandolinjen. Åbn dit terminalvindue, gå til projektmappen, og udfør følgende kommando:

$ slc loopback:model

Dette vil starte en interaktiv session, hvor du kan definere din model. Det første, du vil blive spurgt om, er den datakilde, du vil knytte modellen til. Vi vil vælge den mymongo-datakilde, som vi lige har oprettet før. Dernæst vil den bede om et flertalsnavn til modellen. Lad os bruge standardværdien (stores) og trykke på enter.

 Enter the model name: store Select the data-source to attach store to:db (memory)❯ mymongo (mongodb) Expose store via the REST API? Yes Custom plural form (used to build REST URL):

Når du trykker på enter-tasten, vil du blive bedt om at angive egenskaberne for butiksmodellen. Du kan tænke på dette som var(s), som du definerer på en klasse i PHP.

Enter an empty property name when done. Property name:

De egenskaber, vi ønsker at tilføje, er typen af butik, åbningsdato, breddegrad og længdegrad.

 Property name: opendate invoke loopback:property

Når du trykker på enter, vil du blive bedt om at angive datatype for hver af de angivne egenskaber. Det første element vil være opendate, og vi ønsker at vælge, at det er af typen dato. Vælg dato, og tryk på enter-tasten.

 Property type: string number boolean object array❯ date buffer geopoint (other)

Så bliver du spurgt, om du vil have denne egenskab som en obligatorisk egenskab til skemavalidering. Vi indtaster “ja”.

 Required? (y/N) : y

Du vil derefter blive spurgt om datatype for hver af de resterende egenskaber. Giv følgende svar:

 Property name: type_store invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: latitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: longitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : y

Indtast “yes”, og tryk på enter-tasten.

Godt tillykke! du har netop oprettet dit første modelobjekt ved hjælp af LoopBack i forbindelse med Node.js. Hvis du vil se, hvad der rent faktisk blev oprettet under dække, skal du åbne filen store.json, der ligger i mappen root/common/models i din programmappe. Find posten stores, der vil se ud som følger:

{ "name": "store", "base": "PersistedModel", "properties": { "opendate": { "type": "date", "required": true }, "type_store": { "type": "string", "required": true }, "latitude": { "type": "string", "required": true }, "longitude": { "type": "string", "required": true } }, "validations": , "relations": {}, "acls": , "methods": }

Som du kan se, har vi oprettet en model, og de egenskaber, vi definerede, er tildelt til butiksmodellen. Feltet public angiver, at vi ønsker at eksponere denne model for verden via en REST-webservice.

Mappingen af modellen til datakilden er defineret i model-config.json under app-root/server-mappen. Feltet datasource angiver den datasource, som denne model skal bruge til CRUD-operationer.

"store": { "dataSource": "mymongo", "public": true }

Stræk 8: Afprøv den REST-baserede API##

Guess what? Du har netop oprettet din første REST-baserede webtjeneste ved hjælp af Node.js. Det var ikke så slemt, var det? Lad os tjekke det ud ved at pege vores browser til den applikation, som vi lige har oprettet. Det kan du gøre ved at gå til følgende URL:

http://0.0.0.0:3000/api/stores/

Du vil blive præsenteret for en JSON-repræsentation af alle de Walmart-butikker, som vi har importeret i databasen, som vist på følgende billede:

Ved StrongLoop Explorer###

Jamen, det er jo fantastisk. Vi har et REST endpoint, der returnerer alle Walmart-lagrene i databasen, men tingene synes stadig at mangle en smule, da vi ikke har en forvaltningsgrænseflade til at arbejde med dataene eller til at kontrollere, at alle CRUD-operationer fungerer. Heldigvis tilbyder StrongLoop en praktisk browser, der lader dig udforske alle de endpoints, som din applikation har. Hvis du vil afprøve dette, skal du åbne din browser og gå til følgende URL:

http://0.0.0.0:3000/explorer/

Når Explorer-siden er indlæst, skal du udvide stores API’et for at se alle de tilgængelige operationer, der er tilladt på modelobjektet. Dette vises på følgende billede:

Som et eksempel på, hvad du kan gøre med Explorer, skal du udvide /stores/findOne API’et og klikke på Try it out!-linket, som forespørger databasen og returnerer én post, som vist på følgende billede:

Det er muligt at gå lidt videre ved at tilføje en kortrepræsentation###

Awesome, vi har oprettet et REST-baseret endpoint, der returnerer en liste over alle Walmart-butikker i vores database. For yderligere at illustrere den hastighed, hvormed man kan udvikle komplette applikationer med StrongLoop, lad os bygge en responsiv frontend, der indeholder et kort med pins for hver Walmart-butik.

Stræk 1: Opret den offentlige mappe###

Som standard, som angivet i projektets app.js-fil, vil alle filer i den offentlige mappe, der er placeret i applikationens rodmappe, blive serveret for den, der anmoder om dem. Denne mappe eksisterer dog muligvis ikke som standard, så vi skal oprette den. Åbn din terminal, og skift til rodmappen for din applikation, og udfør følgende kommando:

$ mkdir public

Stræk 2: Opret det responsive kort###

Det næste, vi skal gøre, er at oprette en flot repræsentation af dataene. Da vi har bredde- og længdegrader for hver enkelt butik, ville det være fantastisk at udtrykke dette indhold med et kort, som brugeren kan trække rundt, zoome ind og ud af osv. Denne opgave er faktisk meget nemmere, end man skulle tro, hvis vi benytter os af nogle eksisterende biblioteker. Når vi er færdige med at oprette denne responsive visning, vil resultatet se ud som følger:

Dertil kommer, at brugeren vil kunne zoome ind på et meget detaljeret niveau af kortet for at se den nærmeste Walmart, som vist på følgende billede:

Koden til applikationens webvisning udnytter de egenskaber for længde- og breddegrad, som vi har defineret på vores modelobjekt og importeret til databasen. Vi vil også bruge det populære Leaflet-bibliotek til at oprette kortet og placere pins, eller markører, på kortet.

For at oprette dette kort skal du oprette en ny fil i den offentlige mappe med navnet locatewalmart.html og tilføje følgende JavaScript-kode:

<!doctype html><html lang="en"><head> <title>Walmart Stores</title> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.css" /><!--> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.ie.css" /><!--><script src="https://code.jquery.com/jquery-2.0.0.min.js"></script><link href='http://fonts.googleapis.com/css?family=oswald' rel='stylesheet' type='text/css'><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><style type="text/css">body { padding: 0; margin: 0;}html, body, #map { height: 100%; font-family: 'oswald';}.leaflet-container .leaflet-control-zoom { margin-left: 13px; margin-top: 70px;}#map { z-index: 1;}#title { z-index: 2; position: absolute; left: 10px; }</style></head><body><h1>Walmart Stores</h1><div></div><script src="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.js"></script><script>center = new L.LatLng(39.83, -98.58);zoom = 5;var map = L.map('map').setView(center, zoom);var markerLayerGroup = L.layerGroup().addTo(map);L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {maxZoom: 18,attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);function getPins(e){url = "http://0.0.0.0:3000/api/stores";$.get(url, pinTheMap, "json")}function pinTheMap(data){//clear the current pinsmap.removeLayer(markerLayerGroup);//add the new pinsvar markerArray = ;var lastNumber = 0;for (var i = 0; i < data.length; i++){store = data;if(store.latitude.length > 0 && store.longitude.length>0) {markerArray.push(L.marker());}}markerLayerGroup = L.layerGroup(markerArray).addTo(map);}map.whenReady(getPins)</script></body></html>

Som du kan se, er koden blot standard HTML og JavaScript. Den interessante del er getPins(e)-funktionen, hvor vi foretager et REST-opkald til API’et, som vi oprettede tidligere i dette blogindlæg. Derefter itererer vi over hver butik og opretter en pin på baggrund af bredde- og længdegrad for hver butik. Ret smart, ikke sandt?

Konklusion###

I dette blogindlæg viste jeg dig, hvordan du opretter en REST-baseret webtjeneste, der returnerer en liste over Walmart-butikker i USA. Efter at vi oprettede webtjenesten ved hjælp af Loopback, tilføjede vi en front-end repræsentation af dataene. Med meget lidt arbejde var vi i stand til at udvikle en fuldt fungerende applikation meget hurtigere, end man måske ville kunne gøre med sit nuværende valgsprog. Vi drøftede også nogle af lighederne mellem Node.js og PHP. Selv om jeg stadig mener, at PHP er et fantastisk sprog, har jeg personligt fundet ud af, at Node.js er et godt næste sprog at lære i betragtning af det rige økosystem af biblioteker og den hastighed, hvormed jeg er i stand til at skabe applikationer.

Jeg har inkluderet en hurtig tabel, som du kan henvise til, når du sammenligner Node.js med PHP.

Funktion

PHP

Node.js

Godt IDE

Ja, flere valgmuligheder med IntelliJ, Zend Studio, Netbeans osv, flere valgmuligheder med Eclipse, Visual Studio, Codenvy osv.

Dependency Management

Composer, PEAR

NPM

Enterprise Ready

Ja

Ja

Stort økosystem af biblioteker

Ja, men nogle gange svært at finde

Ja

Almindelige rammer

CodeIgniter, CakePHP, Laravel, osv.

Express, Meteor, osv.

Databaseunderstøttelse

Ja

Ja

Ikkeblokerende IO

Nej

Ja

Test rammer

Ja

Ja

Real-tidsapplikationer

Ja, med yderligere processer såsom Apache WebSocket osv.

Ja

Indbygget webserver

Nej, de fleste bruger i forbindelse med Apache

Ja

  • Klar til at udvikle API’er i Node.js og få dem forbundet til dine data? Tjek Node.js LoopBack-rammen ud. Vi har gjort det nemt at komme i gang enten lokalt eller på din foretrukne cloud med en simpel npm-installation.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.