Serverimplementationer i NodeJS

På Martinsson har vi använt NodeJS för att ta fram prototyper och simulera server-applikationer i flera projekt med mycket bra resultat. Vi använder också NodeJS som en komplett serverlösning på våra inbyggda produkter.

Kort om NodeJS

NodeJS är en runtime-miljö för Javascript (js). Det betyder att Node tillåter att man kör js program på samma sätt som man tidigare har kört exempelvis Python program. Node tillhandahåller dessutom lite finesser som saknas i webbläsaren. Två av dessa finesser är en standardiserad pakethantering och ett modulärt sätt att inkludera kod i sina program.

Pakethanteringen i Node hanteras av "Node package manager" eller npm. Mängden med högkvalitativa open source programmoduler som finns är en av styrkorna med att använda Node.

Med nätet i fokus

Node har en förkärlek till uppkopplade applikationer. En modul som vi har använt flitigt i våra REST baserade projekt är expressjs.
Express gör uppsättning av ett REST API trivial som exemplet nedan visar på:

var express = require('express'),
 app = express();
app.get('/', function (req, res) {
 res.send('Hello World!');
});
app.listen(3000, function () {
 console.log('Server listening on port 3000');
});

Exemplet svarar alltså "Hello World!" när man gör en GET förfrågan på localhost:3000. Inte så spännande kanske, men exemplet visar hur enkelt man lägger upp sitt API. De vanliga CRUD (put, get, post och delete) operationerna stöds såklart.

Fördelarna med en simulator

När vi påbörjar arbetet med en ny uppkopplad applikation finns sällan server delen färdig att börja utveckla mot. För att snabbt komma framåt tar vi därför fram en simulator av servern i Node. Tiden som behövs för detta steget är trivial i förhållande till alla fördelar.

Även när en skarp implementation av serverdelen finns framme fyller simulator en viktig del. Att kunna simulera nya funktioner utan att störa operationen eller utvecklingen av serverdelen är enormt kraftfullt för den enskilde utvecklaren. Protokollspecifikationer får dessutom en extra praktisk granskning genom att två oberoende produkter nu ska följa specifikationen. Det tycker vi är bra!

Simulatorn används sedan med fördel till regressions och funktionstester som utförs ihop med applikationen.

Webbserver för inbyggda system

Stöd för Node finns i Yocto och prestandan är god på många plattformar. Därför har vi på Martinsson valt att bygga våra inbyggda webbservrar direkt med Node. Detta har många fördelar.

Node och dess miljö gör det väldigt enkelt att lägga upp kompletta och responsiva webbapplikationer vars server körs på en inbyggd Linux plattform. En helt självständig serverapplikation som byggts upp i ett och samma programmeringsspråk gör implementationen väl anpassad till inbyggda system och enkel att underhålla.

Exemplet nedan visar på grunderna till en server-applikation som levererar statiskt innehåll (html, css och js), exponerar ett REST-API och öppnar en websocket:

var server = require('http').createServer(),
 express = require('express'),
 app = express(),
 WebSocketServer = require('ws').Server,
 wss = new WebSocketServer({server: server, port: 3030});
app.use(express.static('homepage/'));
app.get('/api/', function (req, res) {
 res.send('Hello World!');
});
function handleClientMessage(ws, message) {
 console.log('received:' + message);
}
function handleConnection(ws) {
 ws.on('message', function (message) {
 handleClientMessage(ws, message);
 });
}
wss.on('connection', handleConnection);
server.on('request', app);
server.listen(3000, function () {
 console.log('started server');
});

Man får väldigt mycket för pengarna så att säga!

Slutsats

Vi på Martinsson försöker ständigt ge våra projekt högre kvalité och korta våra utvecklingskostnader. Node är ett ypperligt verktyg för just detta som vi använt med stor framgång.


Tillbaka till alla artiklar

Nodejs New Pantone Black