How do Express and hapi compare to each other?

后端 未结 6 2064
耶瑟儿~
耶瑟儿~ 2020-12-12 08:51

From web application design and development point of view, how do Express and Hapi compare to each other? For basic examples they seem similar, however I\'m interested to le

6条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-12 09:28

    'use strict';
    const Hapi = require('hapi');
    const Basic = require('hapi-auth-basic');
    const server = new Hapi.Server();
    server.connection({
        port: 2090,
        host: 'localhost'
    });
    
    
    var vorpal = require('vorpal')();
    const chalk = vorpal.chalk;
    var fs = require("fs");
    
    var utenti = [{
            name: 'a',
            pass: 'b'
        },
        {
            name: 'c',
            pass: 'd'
        }
    ];
    
    const users = {
        john: {
            username: 'john',
            password: 'secret',
            name: 'John Doe',
            id: '2133d32a'
        },
        paul: {
            username: 'paul',
            password: 'password',
            name: 'Paul Newman',
            id: '2133d32b'
        }
    };
    
    var messaggi = [{
            destinazione: 'a',
            sorgente: 'c',
            messsaggio: 'ciao'
        },
        {
            destinazione: 'a',
            sorgente: 'c',
            messsaggio: 'addio'
        },
        {
            destinazione: 'c',
            sorgente: 'a',
            messsaggio: 'arrivederci'
        }
    ];
    
    var login = '';
    var loggato = false;
    
    vorpal
        .command('login  ')
        .description('Effettua il login al sistema')
        .action(function (args, callback) {
            loggato = false;
            utenti.forEach(element => {
                if ((element.name == args.name) && (element.pass == args.pass)) {
                    loggato = true;
                    login = args.name;
                    console.log("Accesso effettuato");
                }
            });
            if (!loggato)
                console.log("Login e Password errati");
            callback();
        });
    
    vorpal
        .command('leggi')
        .description('Leggi i messaggi ricevuti')
        .action(function (args, callback) {
            if (loggato) {
                var estratti = messaggi.filter(function (element) {
                    return element.destinazione == login;
                });
    
                estratti.forEach(element => {
                    console.log("mittente : " + element.sorgente);
                    console.log(chalk.red(element.messsaggio));
                });
            } else {
                console.log("Devi prima loggarti");
            }
            callback();
        });
    
    vorpal
        .command('invia  ""')
        .description('Invia un messaggio ad un altro utente')
        .action(function (args, callback) {
            if (loggato) {
                var trovato = utenti.find(function (element) {
                    return element.name == args.dest;
                });
                if (trovato != undefined) {
                    messaggi.push({
                        destinazione: args.dest,
                        sorgente: login,
                        messsaggio: args.messaggio
                    });
                    console.log(messaggi);
                }
            } else {
                console.log("Devi prima loggarti");
            }
            callback();
        });
    
    vorpal
        .command('crea  ')
        .description('Crea un nuovo utente')
        .action(function (args, callback) {
            var trovato = utenti.find(function (element) {
                return element.name == args.login;
            });
            if (trovato == undefined) {
                utenti.push({
                    name: args.login,
                    pass: args.pass
                });
                console.log(utenti);
            }
            callback();
        });
    
    vorpal
        .command('file leggi utenti')
        .description('Legge il file utenti')
        .action(function (args, callback) {
            var contents = fs.readFileSync("utenti.json");
            utenti = JSON.parse(contents);
            callback();
        });
    
    vorpal
        .command('file scrivi utenti')
        .description('Scrive il file utenti')
        .action(function (args, callback) {
            var jsontostring = JSON.stringify(utenti);
            fs.writeFile('utenti.json', jsontostring, function (err) {
                if (err) {
                    return console.error(err);
                }
            });
            callback();
        });
    
    vorpal
        .command('file leggi messaggi')
        .description('Legge il file messaggi')
        .action(function (args, callback) {
            var contents = fs.readFileSync("messaggi.json");
            messaggi = JSON.parse(contents);
            callback();
        });
    
    vorpal
        .command('file scrivi messaggi')
        .description('Scrive il file messaggi')
        .action(function (args, callback) {
            var jsontostring = JSON.stringify(messaggi);
            fs.writeFile('messaggi.json', jsontostring, function (err) {
                if (err) {
                    return console.error(err);
                }
            });
            callback();
        });
    
    // leggi file , scrivi file
    
    vorpal
        .delimiter(chalk.yellow('messaggi$'))
        .show();
    
    
    
    
    const validate = function (request, username, password, callback) {
        loggato = false;
    
    
        utenti.forEach(element => {
            if ((element.name == username) && (element.pass == password)) {
                loggato = true;
                console.log("Accesso effettuato");
                return callback(null, true, {
                    name: username
                })
            }
        });
        if (!loggato)
            return callback(null, false);
    };
    
    server.register(Basic, function (err) {
        if (err) {
            throw err;
        }
    });
    
    server.auth.strategy('simple', 'basic', {
        validateFunc: validate
    });
    
    
    
    server.route({
        method: 'GET',
        path: '/',
        config: {
            auth: 'simple',
            handler: function (request, reply) {
                reply('hello, ' + request.auth.credentials.name);
            }
        }
    });
    
    //route scrivere
    server.route({
        method: 'POST',
        path: '/invia',
        config: {
            auth: 'simple',
            handler: function (request, reply) {
                //console.log("Received POST from " + request.payload.name + "; id=" + (request.payload.id || 'anon'));
                var payload = encodeURIComponent(request.payload)
                console.log(request.payload);
                console.log(request.payload.dest);
                console.log(request.payload.messaggio);
                messaggi.push({
                    destinazione: request.payload.dest,
                    sorgente: request.auth.credentials.name,
                    messsaggio: request.payload.messaggio
                });
                var jsontostring = JSON.stringify(messaggi);
                fs.writeFile('messaggi.json', jsontostring, function (err) {
                    if (err) {
                        return console.error(err);
                    }
                });
                console.log(messaggi);
                reply(messaggi[messaggi.length - 1]);
    
            }
        }
    });
    
    
    //route leggere (json)
    server.route({
        method: 'GET',
        path: '/messaggi',
        config: {
            auth: 'simple',
            handler: function (request, reply) {
                messaggi = fs.readFileSync("messaggi.json");
                var estratti = messaggi.filter(function (element) {
                    return element.destinazione == request.auth.credentials.name;
                });
                var s = [];
    
                console.log(request.auth.credentials.name);
                console.log(estratti.length);
                estratti.forEach(element => {
    
                    s.push(element);
    
                    //fare l'array con stringify
                    //s+="mittente : "+element.sorgente+": "+element.messsaggio+"\n";
    
                });
                var a = JSON.stringify(s);
                console.log(a);
                console.log(s);
                reply(a);
            }
        }
    });
    
    
    
    server.start(function () {
        console.log('Hapi is listening to ' + server.info.uri);
    });
    
    function EseguiSql(connection, sql, reply) {
        var rows = [];
        request = new Request(sql, function (err, rowCount) {
            if (err) {
                console.log(err);
            } else {
                console.log(rowCount + ' rows');
                console.log("Invio Reply")
                reply(rows);
            }
        });
    
        request.on('row', function (columns) {
            var row = {};
            columns.forEach(function (column) {
                row[column.metadata.colName] = column.value;
            });
            rows.push(row);
        });
    
        connection.execSql(request);
    }
    
    server.route({
        method: 'POST',
        path: '/query',
        handler: function (request, reply) {
            // Qui dovrebbe cercare i dati nel body e rispondere con la query eseguita
            var connection = new Connection(config);
    
            // Attempt to connect and execute queries if connection goes through
            connection.on('connect', function (err) {
                if (err) {
                    console.log(err);
                } else {
    
                    console.log('Connected');
                    console.log(request.payload.sql);
                    EseguiSql(connection, request.payload.sql, reply);
                }
            });
    
        }
    });
    
    server.connection({
        host: process.env.HOST || 'localhost',
        port: process.env.PORT || 8080
    });
    
    var config = {
        userName: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        server: process.env.DB_SERVER,
        options: {
            database: process.env.DB_NAME,
            encrypt: true
        }
    }
    

提交回复
热议问题