Express ve hapi birbirleriyle nasıl karşılaştırılır?


133

Web uygulaması tasarımı ve geliştirme açısından, Express ve Hapi birbirleriyle nasıl karşılaştırılır? Temel örnekler için benzer görünüyorlar, ancak genel uygulama yapısındaki temel farklılıklar hakkında daha fazla bilgi edinmek istiyorum.

Örneğin, öğrendiğim kadarıyla Hapi, kayıt sırasını hesaba katmayan, daha hızlı arama yapabilen, ancak Express'e göre sınırlı olan farklı bir yönlendirme mekanizması kullanıyor . Başka önemli farklılıklar var mı?

Yeni npmjs.com web sitesini geliştirmek için Hapi'yi (Express üzerinden) seçme hakkında bir makale de var , bu makale "Hapi'nin eklenti sistemi, uygulamanın farklı yönlerini ve hizmetlerini, uygulamadaki mikro hizmetlere izin verecek şekilde izole edebileceğimiz anlamına geliyor Öte yandan Express, aynı işlevselliği elde etmek için biraz daha fazla yapılandırma gerektiriyor ", tam olarak ne anlama geliyor?

Yanıtlar:


231

Bu büyük bir soru ve uzun bir cevabın tamamlanmasını gerektiriyor, bu yüzden en önemli farklılıkların bir alt kümesini ele alacağım. Hala uzun bir cevap olduğu için özür dileriz.

Nasıl benzerler?

Söylediğinizde kesinlikle haklısınız:

Temel örnekler için benzer görünüyorlar

Her iki çerçeve de aynı temel sorunu çözüyor: Düğümde HTTP sunucuları oluşturmak için uygun bir API sağlamak. Yani, alt düzey yerel httpmodülü tek başına kullanmaktan daha uygundur . httpModül istediğimiz her şeyi yapabilir ama birlikte yazma uygulamalarına sıkıcı bu.

Bunu başarmak için her ikisi de uzun süredir yüksek seviyeli web çerçevelerinde bulunan kavramları kullanıyor: yönlendirme, işleyiciler, eklentiler, kimlik doğrulama modülleri. Her zaman aynı isimlere sahip olmayabilirler ama kabaca eşdeğerler.

Temel örneklerin çoğu şuna benzer:

  • Bir rota oluşturun
  • Rota talep edildiğinde yanıtı hazırlayarak bir işlevi çalıştırın
  • Talebe cevap verin

Hızlı:

app.get('/', function (req, res) {

    getSomeValue(function (obj) {

        res.json({an: 'object'});
    });
});

hapi:

server.route({
    method: 'GET',
    path: '/',
    handler: function (request, reply) {

        getSomeValue(function (obj) {

            reply(obj);
        });
    }
});

Fark burada tam olarak çığır açıcı değil değil mi? Öyleyse neden birini diğerine tercih edesiniz?

Nasıl farklılar?

Basit cevap, hapi'nin çok daha fazlası olduğu ve çok daha fazlasını kutudan çıkaracağıdır. Yukarıdan basit bir örneğe baktığınızda bu net olmayabilir. Aslında, bu kasıtlıdır. Basit durumlar basit tutulur. Öyleyse bazı büyük farkları inceleyelim:

Felsefe

Ekspres çok minimum düzeyde olacak şekilde tasarlanmıştır. Üstünde ince bir tozlanma ile size küçük bir API vererek http, ek işlevsellik eklemek açısından hala kendi başınızasınız. Gelen bir talebin metnini okumak istiyorsanız (oldukça yaygın bir görev), ayrı bir modül kurmanız gerekir . Bu rotaya çeşitli içerik türlerinin gönderilmesini bekliyorsanız, Content-typebaşlığın hangisi olduğunu kontrol etmek ve buna göre ayrıştırmak için başlığı da kontrol etmeniz gerekir (örneğin, JSON ve çok parçalı form), genellikle ayrı modüller kullanarak .

hapi, kod yazılmasını gerektirmek yerine, genellikle yapılandırma seçenekleriyle açığa çıkan zengin bir özellik setine sahiptir. Örneğin, işleyici çalıştırılmadan önce bir istek gövdesinin (yük) belleğe tam olarak okunduğundan ve uygun şekilde ayrıştırıldığından (içerik türüne göre otomatik olarak) emin olmak istiyorsak, bu sadece basit bir seçenektir :

server.route({
    config: {
        payload: {
            output: 'data',
            parse: true
        }
    },
    method: 'GET',
    path: '/',
    handler: function (request, reply) {

        reply(request.payload);
    }
});

Özellikleri

Hapi'nin daha büyük bir özellik seti sunduğunu görmek için her iki projedeki API belgelerini karşılaştırmanız yeterlidir.

hapi, Express'te bulunmayan aşağıdaki özelliklerden bazılarını içerir (bildiğim kadarıyla):

Genişletilebilirlik ve modülerlik

hapi ve Express, genişletilebilirliği oldukça farklı bir şekilde ele alıyor. Express ile ara yazılım işlevlerine sahipsiniz . Ara yazılım işlevleri, istiflediğiniz filtreler gibidir ve tüm istekler, işleyicinize ulaşmadan önce bunların üzerinden geçer.

hapi, istek yaşam döngüsüne sahiptir ve ara yazılım işlevleriyle karşılaştırılabilir, ancak istek yaşam döngüsünde birkaç tanımlı nokta bulunan uzantı noktaları sunar .

Walmart'ın hapi oluşturup Express'i kullanmayı bırakmasının nedenlerinden biri, bir Express uygulamasını ayrı parçalara bölmenin ve farklı ekip üyelerinin yığınları üzerinde güvenli bir şekilde çalışmasını sağlamanın ne kadar zor olduğuyla ilgili bir hayal kırıklığı oldu. Bu nedenle hapi'de eklenti sistemini oluşturdular .

Bir eklenti bir alt uygulama gibidir, bir hapi uygulamasında yapabileceğiniz her şeyi yapabilir, rotalar, uzantı noktaları vb. Ekleyebilirsiniz. Bir eklentide uygulamanın başka bir bölümünü bozmadığınızdan emin olabilirsiniz, çünkü rota kayıtları önemli değildir ve çakışan rotalar oluşturamazsınız. Daha sonra bu eklentileri bir sunucuda birleştirebilir ve dağıtabilirsiniz.

Ekosistem

Express size kutudan çok az şey verdiğinden, projenize bir şey eklemeniz gerektiğinde dışarıya bakmanız gerekir. Hapi ile çalışırken çoğu zaman ihtiyacınız olan özellik ya yerleşiktir ya da çekirdek ekip tarafından oluşturulmuş bir modül vardır.

Minimal sesler harika. Ancak ciddi bir prodüksiyon uygulaması oluşturuyorsanız, muhtemelen tüm bunlara eninde sonunda ihtiyacınız olacak.

Güvenlik

hapi, Walmart ekibi tarafından Kara Cuma trafiğini yürütmek üzere tasarlandı, bu nedenle güvenlik ve istikrar her zaman en önemli endişe kaynağı oldu. Bu nedenle çerçeve, işlem belleğinizin tükenmesini önlemek için gelen yük boyutunu sınırlamak gibi fazladan birçok şey yapar. Ayrıca, maksimum olay döngü gecikmesi, kullanılan maksimum RSS belleği ve v8 yığınının maksimum boyutu gibi seçeneklere de sahiptir; bunun ötesinde sunucunuz, yalnızca çökme yerine 503 zaman aşımı ile yanıt verir.

özet

İkisini de kendiniz değerlendirin. İhtiyaçlarınızı ve ikisinden hangisinin en büyük endişelerinizi karşıladığını düşünün. İki topluluğa (IRC, Gitter, Github) dalın, hangisini tercih ettiğinizi görün. Sadece sözümü dinleme. Ve mutlu hackler!


SORUMLULUK REDDİ: Hapi üzerine bir kitabın yazarı olarak önyargılıyım ve yukarıdakiler büyük ölçüde kişisel görüşüm.


7
Matt, kapsamlı yazı için teşekkürler, "genişletilebilirlik ve modülerlik" ve "güvenlik" bölümleri benim için en yararlı bölümlerdi. Express 4'teki yeni yönlendirme sisteminin alt uygulamalar için geliştirilmiş modülerlik sağladığını belirtmekte fayda var sanırım.
Ali Shakiba

1
Harika cevap Matt. Hapi ve Express için de kafamız karıştı, Hapi ile gördüğümüz bir dezavantaj, Express kadar kapsamlı bir topluluk desteğine sahip olmaması ve bir yerde takılıp kalırsak büyük bir sorun olabileceğidir. Aynı konuda fikrinize ihtiyacınız var.
Aman Gupta

1
Ekspres jeneriktir, hapi ise biraz daha kurumsaldır.
windmaomao

1
@MattHarrison harika cevap, şu anda kitabınızı Hapi'de okuyorum, harika. Arka uçta Hapi ve ön uçta vue.js kullanarak kitaplar için yeni bir pazar geliştirmek üzereyim, Hapi'ye alıştıktan sonra Hapi projesine aktif olarak katılmak istiyorum.
Humoyun Ahmad

1
@Humoyun Harika! <= V16.0.0'dan bu yana bazı önemli değişikliklerle birlikte hapi'nin yeni bir ana sürümü olduğunu unutmayın. Şu anda insanların v17 öğrenmesi için tasarlanmış bir ekran yayını serisi hazırlıyorum: youtube.com/playlist?list=PLi303AVTbxaxqjaSWPg94nccYIfqNoCHz
Matt Harrison

54

Organizasyonum Hapi ile gidiyor. Bu yüzden seviyoruz.

Hapi:

  • Büyük kolordu tarafından destekleniyor. Bu, topluluk desteğinin güçlü olacağı ve gelecekteki sürümler boyunca sizin için orada olacağı anlamına gelir. Tutkulu Hapi çalışanları bulmak kolaydır ve dışarıda iyi öğreticiler vardır (ancak ExpressJ'lerin eğitimleri kadar çok sayıda ve geniş kapsamlı olmasa da). Bu gönderi tarihi itibariyle npm ve Walmart Hapi'yi kullanıyor.
  • API yüzeyinin geri kalanı hakkında kapsamlı bilgiye sahip olmak zorunda kalmadan arka uç hizmetlerinin çeşitli bölümlerinde çalışan dağıtılmış ekiplerin işini kolaylaştırabilir (Hapi'nin eklenti mimarisi bu kalitenin somut örneğidir).
  • Bırakın çerçeve bir çerçevenin yapması gerekeni yapsın: şeyleri yapılandırın. Bundan sonra çerçeve görünmez olmalı ve geliştiricilerin gerçek yaratıcı enerjilerini iş mantığı oluşturmaya odaklamalarına izin vermelidir. Hapi'yi bir yıl kullandıktan sonra kesinlikle Hapi'nin bunu başardığını hissediyorum. Mutlu hissediyorum!

Doğrudan Eran Hammer'dan haber almak istiyorsanız (Hapi'nin lideri)

Geçtiğimiz dört yıl içinde hapi, büyük ya da küçük birçok projenin tercih edilen çerçevesi haline geldi. Hapi'yi benzersiz kılan şey, büyük dağıtımlara ve büyük ekiplere ölçeklendirme yeteneğidir. Bir proje büyüdükçe karmaşıklığı da artar - mühendislik karmaşıklığı ve süreç karmaşıklığı. Hapi'nin mimarisi ve felsefesi, kodu sürekli olarak yeniden düzenlemeye gerek kalmadan artan karmaşıklığı ele alır [devamını okuyun]

Hapi'yi kullanmaya başlamak ExpressJ'ler kadar kolay olmayacak çünkü Hapi aynı "yıldız gücüne" sahip değil ... ama kendinizi rahat hissettiğinizde ÇOK mesafe alacaksınız. ExpressJ'leri birkaç yıldır sorumsuzca kullanan yeni bir hacker olarak yaklaşık 2 ayımı aldı. Tecrübeli bir arka uç geliştiriciyseniz, belgeleri nasıl okuyacağınızı bilirsiniz ve muhtemelen bunu fark etmezsiniz bile.

Hapi belgelerinin geliştirebileceği alanlar:

  1. kullanıcıların kimliği nasıl doğrulanır ve oturumlar nasıl oluşturulur
  2. Çapraz Kaynak İsteklerini (CORS) işleme
  3. dosya yükleme (çok parçalı, parçalı)

Bence kimlik doğrulamanın en zorlu kısmı, çünkü hangi tür bir kimlik doğrulama stratejisinin kullanılacağına karar vermelisiniz (Temel Kimlik Doğrulama, Çerezler, JWT Belirteçleri, OAuth). Teknik olarak, oturumların / kimlik doğrulama ortamının böylesine parçalanmış olması Hapi'nin sorunu olmasa da ... ama bunun için bir miktar el tutma sağlamalarını diliyorum. Geliştirici mutluluğunu büyük ölçüde artıracaktır.

Kalan ikisi aslında o kadar zor değil, dokümanlar biraz daha iyi yazılabilirdi.


3

Hapi Hakkında Kısa Bilgiler Veya Neden Hapi JS?

Hapi konfigürasyon merkezlidir Çerçevede yerleşik kimlik doğrulama ve yetkilendirmeye sahiptir Savaşta test edilmiş bir atmosferde piyasaya sürüldü ve gerçekten değerini kanıtladı Tüm modüller% 100 test kapsamına sahiptir Çekirdek HTTP'den uzakta en yüksek soyutlama seviyesini kaydeder Kolayca anlaşılabilir eklenti mimarisi aracılığıyla

Hapi, performans açısından daha iyi bir seçimdir Hapi, daha hızlı aramalar yapabilen ve kayıt sırasını hesaba katabilen farklı bir yönlendirme mekanizması kullanır. Yine de Express ile karşılaştırıldığında oldukça sınırlıdır. Hapi eklenti sistemi sayesinde, uygulamaya gelecekte birçok yönden yardımcı olacak farklı yönleri ve hizmetleri izole etmek mümkündür.

kullanım

Hapi, Express ile karşılaştırıldığında en çok tercih edilen çerçevedir. Hapi, esas olarak büyük ölçekli kurumsal uygulamalar için kullanılır.

Geliştiricilerin kurumsal uygulamalar oluştururken Express'i seçmemelerinin birkaç nedeni şunlardır:

Express'te rotaları oluşturmak daha zor

Ara yazılım çoğu zaman yoluna girer; Her rotayı tanımladığınızda, istediğiniz kadar kod yazmanız gerekir.

Hapi, RESTful API oluşturmak isteyen bir geliştirici için en iyi seçim olacaktır. Hapi, mikro servis mimarisine sahiptir ve kontrolü belirli parametrelere göre bir handler'dan diğerine aktarmak da mümkündür. Hapi eklentisi ile, iş mantığını kolayca yönetilebilir parçalara bölebileceğiniz için, HTTP çevresinde daha yüksek bir soyutlamanın tadını çıkarabilirsiniz.

Hapi'nin bir diğer büyük avantajı, yanlış yapılandırdığınızda ayrıntılı hata mesajları sağlamasıdır. Hapi ayrıca dosya yükleme boyutunuzu varsayılan olarak yapılandırmanıza izin verir. Maksimum yükleme boyutu sınırlıysa, kullanıcıya dosya boyutunun çok büyük olduğunu belirten bir hata mesajı gönderebilirsiniz. Bu, sunucunuzun çökmesini önler çünkü dosya yüklemeleri artık tüm dosyayı arabelleğe almayı denemeyecektir.

  1. Ekspres kullanarak elde edebileceğiniz her şeye hapi.js kullanılarak da kolayca ulaşılabilir.

  2. Hapi.js çok şık ve kodu çok iyi organize ediyor. Yönlendirmeyi nasıl yaptığını ve temel mantığı denetleyicilere koyduğunu görürseniz, meydan okurcasına seveceksiniz.

  3. Hapi.js resmi olarak, yalnızca hapi.js için belirteç tabanlı yetkilendirmeden oturum yönetimine ve çok daha fazlasına kadar çeşitli eklentiler sağlar. Bu geleneksel npm'nin kullanılamayacağı anlamına gelmez, hepsi hapi.js tarafından desteklenir

  4. Hapi.js'de kodlarsanız, bir kodun bakımı çok kolay olacaktır.


"Yönlendirme işlemini nasıl yaptığını ve temel mantığı denetleyicilere koyduğunu görürseniz ...". Dokümantasyonda denetleyicilerin kullanımını gösteren herhangi bir örnek göremiyorum. Tüm yönlendirme örnekleri, bir işlev olan handler özelliğini kullanır. Bu yolu, yönlendirme için denetleyicileri kullanabileceğimiz yönlendirme için Laravel (PHP çerçevesi) ve AdonisJ'lerin (Node.js çerçevesi) yaptıklarıyla karşılaştırıyorum. HAPI belgesinin yönlendirme için denetleyicilerin kullanımını gösteren bölümlerini muhtemelen kaçırdım. Bu özellik varsa, benim için iyi olacak, çünkü Laravel'de yönlendirme için denetleyicileri kullanmaya alışkınım.
Lex Soft

1

Son zamanlarda Hapi kullanmaya başladım ve bundan oldukça memnunum. Nedenlerim

  1. Test etmesi daha kolay. Örneğin:

    • server.inject uygulamayı çalıştırmadan ve dinlemeden bir yanıt almanızı sağlar.
    • server.info mevcut uri'yi, portu vb. verir.
    • server.settingsyapılandırmaya erişir, örneğin server.settings.cachemevcut önbellek sağlayıcısını alır
    • şüpheye düştüğünüzde /testuygulamanın herhangi bir kısmının klasörlerine veya desteklenen eklentilere bakın ve nasıl alay / test / saplama vb.
    • Benim düşünceme göre, hapi'nin mimari modeli güvenmenize izin veriyor ancak doğrulamanıza izin veriyor. Örneğin, eklentilerim kayıtlı mı? Modül bağımlılığını nasıl bildirebilirim ?
  2. Kutudan çıktığı gibi çalışır, örneğin dosya yüklemeleri , uç noktalardan dönüş akışları vb.

  3. Temel eklentiler, temel kitaplıkla birlikte korunur. örneğin şablon ayrıştırma , önbelleğe alma vb. Ek avantaj, temel şeylere uygulanan kodlama standartlarının aynısıdır.

  4. Hataları ve hataları düzeltin. Hapi, yapılandırma seçeneklerini doğrular ve yinelenen yolları önlemek için dahili bir yönlendirme tablosu tutar. Bu, öğrenme sırasında oldukça kullanışlıdır çünkü hata ayıklama gerektiren beklenmedik davranışlar yerine hatalar erken atılır.


-1

Eklenecek bir başka nokta da, Hapi, sürüm 16'dan itibaren (yanılmıyorsam) 'http2' çağrılarını desteklemeye başladı. Ancak, express henüz "http2" modülünü express 4'e kadar desteklemiyor. Bununla birlikte, bu özelliği express 5'in alfa sürümünde yayınlamış olsalar da.


-2
'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 <name> <pass>')
    .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 <dest> "<messaggio>"')
    .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 <login> <pass>')
    .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
    }
}

StackOverflow'a hoş geldiniz. Cevabınız ve bunun OP tarafından gönderilen soru ile nasıl bir ilişkisi olduğu hakkında daha fazla ayrıntı verebilir misiniz?
Szymon Maszke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.