Zur Übersicht

Node.js und MongoDB am Raspberry Pi

Wie man Node.js und MongoDB am Raspberry Pi installiert und seinen Server automatisch beim Booten startet.

Artikelbild

Der Raspberry Pi ist wirklich ein kleiner Alleskönner. In letzter Zeit verwende ich ihn gerne als Node-Server. Hier ist ein Beispiel, wie man auf einem Raspberry Pi 2 Node.js und MongoDB installieren kann. Außerdem wird ein automatisches Start-Script hinterlegt, welches beim Booten vom Pi automatisch ausgeführt wird.

Node.js installieren

Mit folgendem Befehl werden NodeSource Packages zu apt hinzugefügt:
(code lang: bash)
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
(/code)

Nun kann Node.js über apt-get installiert werden:

(code lang: bash)
sudo apt install nodejs
(/code)

Jetzt sollte node im Terminal zur Verfügung stehen:

(code lang: bash)
pi@raspberrypi:~ $ node -v
v6.8.1
(/code)

MongoDB installieren

Um MongoDB zu installieren benötigt man folgenden Befehl:

(code lang: bash)
sudo apt-get install mongodb-server
(/code)

Um zu testen, ob alles korrekt installiert wurde, kann man wie folgt die Version überprüfen:

(code lang: bash)
pi@raspberrypi:~ $ mongo --version
MongoDB shell version: 2.4.10
(/code)

Auto-Start-Script

Um am Pi einen Node-Server automatisch nach dem Booten zu starten, lege ich zuerst ein Script mit Ausführungsrechten in meinem Home-Verzeichnis an:

(code lang: bash)
cd
touch startup.sh
chmod +x startup.sh
(/code)

Um dieses beim Starten des Pis auszuführen, wird dieses unter /etc/rc.local eingetragen:

(code lang: bash)
sudo nano /etc/rc.local
/home/pi/startup.sh
(/code)

Starten des Node.js-Servers

Für den Server kommt Express zum Einsatz. Die package.json hat folgenden Inhalt:

(code lang: javascript)
{
...
"dependencies": {
"express": "^4.14.0",
"mongodb": "^2.2.11",
"promise": "^7.1.1"
}
}
(/code)

Das Server-Script sieht wie folgt aus:

(code lang: javascript)
// index.js
var MongoClient = require('mongodb').MongoClient;
var Promise = require('promise');
var express = require('express');
var app = express();
var url = 'mongodb://localhost:27017/test';

function connect(url) {
return new Promise(function(resolve, reject) {
MongoClient.connect(url, function(err, db) {
if (err) {
console.error('mongo connection error: ', err.message);
reject(err);
} else {
console.info("connected to mongodb");
resolve(db);
}
});
});
}

connect(url).then(function(db) {
app.get('/', function (req, res) {
// do something with db
res.send('Node.js and MongoDB up and running');
});

app.listen(3000, function () {
console.log('Server started on port 3000!');
});
}, function(err) {
console.error(err);
});
(/code)

Diese zwei Dateien werden auf den Raspberry Pi in folgenden Ordner übertragen:

(code lang: bash)
pi@raspberrypi:~ $ cd server/express/
pi@raspberrypi:~/server/express $ ll
total 8
-rw-r--r-- 1 pi pi 805 Oct 22 20:27 index.js
-rw-r--r-- 1 pi pi 311 Oct 22 20:27 package.json
(/code)

Die fehlenden Dependencies können mit diesem Befehl installiert werden:

(code lang: bash)
pi@raspberrypi:~/server/express $ npm install
(/code)

Um zu testen, ob alles korrekt installiert wurde, kann man den Server wie folgt starten:

(code lang: bash)
pi@raspberrypi:~/server/express $ node index.js
connected to mongodb
Server started on port 3000!
(/code)

Wenn das alles geklappt hat, kann dieser Befehl in die startup.sh übertragen werden, um den Node-Server automatisch beim Booten zu starten. Um auf Nummer Sicher zu gehen, wird der Pfad von Node.js im Ganzen angegeben. Diesen bekommen man über den Befehl which node.

(code lang: bash)
pi@raspberrypi:~/server/express $ which node
/usr/bin/node
(/code)

Nun kann der endgültige Befehl in die startup.sh eingetragen werden:

(code lang: bash)
cd
nano startup.sh
(/code)

Dort fügt man diesen Befehl ein:

(code lang: bash)

!/bin/bash

/usr/bin/node /home/pi/server/express/index.js
(/code)

Zum Testen kann das Script direkt aufgerufen werden:

(code lang: bash)
./startup.sh
(/code)

Beim nächsten Neustart des Pi sollte nun der Server automatisch gestartet werden.

Viel Spaß beim Basteln! 👍

Kommentare

comments powered by Disqus