Applicazioni Web in React, Bootstrap, MongoDB, Express/Creare un web server Node Express

Indice del libro

Installare Node.Js ed Express GeneratorModifica

  • 1) Node.Js è un framework Javascript che consente anche di scrivere codice lato server e quindi in particolare consente di realizzare un web server Express . npm (abbreviazione di Node Package Manager[2]) è il gestore di pacchetti predefinito per l'ambiente di runtime JavaScript Node.js. Consiste in un client da linea di comando, chiamato anch'esso npm, e un database online di pacchetti pubblici e privati, chiamato npm registry.
  • 2) Installare Node.js sul proprio PC da qui: https://nodejs.org/
  • 3) Nel terminale digitare:
node -v
npm -v

per verificare che sia node che npm siano installati correttamente nel proprio sistema.

  • 4) Installare il package express-generator tramite npm digitando nel terminale:
npm install express-generator -g
  • 5) Aprire il terminale nei Documenti e digitare:
express ItemsServer
  • 6) Nella cartella ItemsServer, digitare nel terminale:
npm install
  • 7) Nella dir ItemsServer digitare nel terminale per avviare il server:
npm start
  • 8) Nel browser al link http://localhost:3000/ apparirà il messaggio "Welcome to Express" .Un web server Node Express è fatto !

API REST and MONGOOSEModifica

Le richieste che il client fa al server si realizzano tramite le API REST . Ad esempio, se si esegue una richiesta GET, si sta chiedendo al server di restituire la risorsa. Se si esegue una richiesta POST, si sta chiedendo al server di creare una nuova risorsa. Se si esegue una richiesta PUT, si sta chiedendo al server di aggiornare una risorsa esistente. E se si emette una richiesta DELETE, si sta chiedendo al server di eliminare la risorsa identificata dal particolare URL. Lo scambio dei dati tra client e server avviene in formato JSON che rappresenta lo standard con cui si costruiscono gli oggetti Javascript. Ad esempio l'URL http://localhost:3000/items/234 significa che il client chiede al server di agire sull'item 234, su cui è possibile svolgere operazioni di GET, PUT o DELETE. Per implementare le chiamate API REST sul database MongoDB bisogna installare mongoose:


  • 1) Nella dir ItemsServer aprire un terminale e digitare:
npm install mongoose@5.7.0 –save
  • 2) Creare uno schema mongoose per il documento items del database MongoDB ed inserire nella sotto cartella models di ItemsServer il file items.js
// items.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var itemSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    quantity: {
        type: Number,
        required: true
    },
    measure: {
        type: String,
        required: true
    }
},    {
    timestamps: true
});

var Items = mongoose.model('Item', itemSchema);

module.exports = Items;
  • 3) Nella sotto cartella routes di ItemServer, creare il file itemRouter.js :
// itemRouter.js
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

const Items = require('../models/items');

const itemRouter = express.Router();

itemRouter.use(bodyParser.json());

itemRouter.route('/')
.get((req,res,next) => {
    Items.find({})
    .then((resp) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(resp);
    }, (err) => next(err))
    .catch((err) => next(err));
})
.post((req, res, next) => {
    Items.create(req.body)
    .then((resp) => {
        console.log('Item Created ', resp);
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(resp);
    }, (err) => next(err))
    .catch((err) => next(err));
})
.put((req, res, next) => {
    res.statusCode = 403;
    res.end('PUT operation not supported on /items');
})
.delete((req, res, next) => {
    Items.remove({})
    .then((resp) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(resp);
    }, (err) => next(err))
    .catch((err) => next(err));    
});

itemRouter.route('/:itemId')
.get((req,res,next) => {
    Items.findById(req.params.itemId)
    .then((resp) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(resp);
    }, (err) => next(err))
    .catch((err) => next(err));
})
.post((req, res, next) => {
    res.statusCode = 403;
    res.end('POST operation not supported on /items/'+ req.params.itemId);
})
.put((req, res, next) => {
    Items.findByIdAndUpdate(req.params.itemId, {
        $set: req.body
    }, { new: true })
    .then((resp) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(resp);
    }, (err) => next(err))
    .catch((err) => next(err));
})
.delete((req, res, next) => {
    Items.findByIdAndRemove(req.params.itemId)
    .then((resp) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(resp);
    }, (err) => next(err))
    .catch((err) => next(err));
});

module.exports = itemRouter;
  • 4) modificare il file app.js nella dir ItemsServer  :
// app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var itemsRouter = require('./routes/itemRouter');

var app = express();

const mongoose = require('mongoose');


mongoose.Promise = require('bluebird');

const url = 'mongodb://localhost:27017/db_items';

const options = {
  useMongoClient: true,
  autoIndex: false, // Don't build indexes
  reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
  reconnectInterval: 500, // Reconnect every 500ms
  poolSize: 10, // Maintain up to 10 socket connections
  // If not connected, return errors immediately rather than waiting for reconnect
  bufferMaxEntries: 0
};

mongoose.connect(url, options);

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
  next();
  });

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/items', itemsRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
  • 5) Abbiamo creato un web server Node Express che si connette con un database MongoDB.

Link esterniModifica