07-08-2020 | Programming
Serwer w Node.js [cześć 1]

Czasami człowiek musi zrobić coś po raz pierwszy, coś czego się wystrzegał, coś czego za bardzo nielubił / nieznał (niepotrzebne skreślić). Otóż zawsze wolałem pracować na froncie, ale … no właśnie, zawsze jest jakieś “ale”. Piszę aplikację i jakbym na nią nie patrzył, jak bym się nie zastanawiał to wychodzi mi na to że, potrzebuję serwera na node.js. W sumie node to przecież jest javascript, więc pomyślałem że, punkt wejścia jest dla mnie o wiele łatwiejszy niż musiałbym zapoznawać się np z ruby.

Acha, zapomniałęm dodać jaki jest kontekst mojego serwera. Otóż w pierwszej iteracji serwer ma “być” i serwować moją apke w react. Na tym się skupiłem na początek.

A więc wyzwanie: „postawić serwer node.js”. Szybki research w sieci i zdecydowałem że, najłatwiej będzie mi wykorzystać express.js. 

Jak zacząć? Bardzo prosto 🙂 W katalogu projektu stworzyłem przestrzeń dla mojego serwera i utworzyłem plik server.js, będzie to mój punkt wyjścia. Następnie dodałem do projektu express

npm install express --save

Po zaisntalowaniu się paczki zacząłem tworzyć właściwy serwer. Mój plik server.js

const path = require("path");
const express = require("express");
const app = express();
const publicPath = path.join(__dirname, "..", "public");
const port = process.env.PORT || 3000;
 
app.use(express.static(publicPath));
app.get("*", (req, res) => {
  res.sendFile(path.join(publicPath, "index.html"));
});
 
app.listen(port, () => {
  console.log("server is up");
});

Dwa słowa komentarza, w podstawowej konfiguracji okazuję się trywialne. importuje potrzebne moduły (express, path) i tworzę instancję expressa. Jako że główny router jest w aplikacji reactowej to na poziomie servera wszystkie żądania odsyłają do pliku index.html (gdzie uruchamia się aplikacja reactowa) i oto całą magia 🙂

Podczas lektur w necie wyszukałem informację że, dobrze jest zabezpieczyć swój serwer na różnego rodzaju niebezpieczeństwa (co jest logiczne). Wiele osób poleca pakiet Helmet. Jest to zbiór reguł , ustawień , zabezpieczeń pomagający pozbyć się kilku potencjalnych kierunków ataku na serwer a także poprawiają bezpieczeństwo nagłówków HTTP

Dodanie Helmeta do projektu:

npm install helmet

następnie trzeba go zaimportować do pliku serwera:

const helmet = require('helmet');

i wykorzystać

app.use(helmet())

czyli finalnie, całościowo w pierwszej iteracji mój serwer wygląda tak:

const path = require("path");
const express = require("express");
const helmet = require('helmet');
const app = express();
const publicPath = path.join(__dirname, "..", "public");
const port = process.env.PORT || 3000;
 
app.use(helmet())
 
app.use(express.static(publicPath));
app.get("*", (req, res) => {
  res.sendFile(path.join(publicPath, "index.html"));
});
 
app.listen(port, () => {
  console.log("server is up");
});

i gotowe. Serwer jest gotowy do działania. Jako środowisko testowe wykorzystałem Heroku. Dodałem do package.json script

"heroku-postbuild": "npm run build:prod",

sam deploy odbywa sie za pomocą Heroku CLI.  Wystarczy w terminalu wpisać:

git push heroku master

i po chwili można podziwiać efekt swoje pracy.

Powiem szczerze że spodobało mi się to, a biorąc pod uwagę ile funkcjonalności chce tam dodać to będę miał trochę zabawy 🙂

Ten wpis jest pierwszym z serii opowiadającym o mojej przygodzie z node.js. Wpisy powstają na bieżąco wraz z rozwojem mojego serwera.