Kuidas luua lihtsat RESTful API koos NodeJs, ExpressJs ja MongoDb

Värskendatud 11. juuli 2019: see artikkel on oluline verstapost jõuda enam kui 70 000 lugejani ja tagasiside põhjal on sellest paljudele inimestele abi olnud, rajades API-sid NodeJ-ide abil. Selle paremaks muutmiseks olen värskendanud selle õpetuse koodilõike, et parandada enamiku lugejate tuvastatud vead. Tänan teid kõiki lahkete vastuste eest. Loodan, et leian varsti aega veel ühe hea vastuse kirjutamiseks. Minge ja ehitage maailmale hämmastavaid rakendusi - David Inyangetoh

RESTFul API-d on juba mõnda aega olemas olnud. Selle kirjutamise ajal on teil praktiliselt võimatu olla tarkvaraarendaja, ilma et peaksite looma või kasutama ühte või mitut API-d.

API on rakenduse programmeerimisliidese lühend, mis on muutunud tarkvaraarenduse lahutamatuks osaks. „See on erinevate komponentide vaheliste selgelt määratletud meetodite kogum“ - Vikipeedia.

RESTFul APIs seevastu on API, mis vastab REST arhitektuuristiilile. REST viitab esinduslikule riigiülekandele, mis „on arhitektuuristiil, mis määratleb HTTP-l põhinevate piirangute ja omaduste kogumi”.

Veebiteenuse RESTFul kõige levinum juurutamine on JSON API ja sellega me selles õpetuses töötamegi. JSONAPI spetsifikatsioonide, näidete ja juurutamise kohta saate lisateavet siit. JSON on lihtsalt Javascripti objektide märge.

Selles õpetuses loome kontaktide jaoks CRUD-funktsioonidega ExpressJ-de ja MongoDbi abil lihtsa API.

Vajalikud rakendused

  • SõlmJS
  • Postimees
  • MongoDb
  • IDE

Alustame…

Projekti alglaadimine

Meie projekti alglaadimiseks peame kontrollima, kas meie masinasse on installitud NodeJs, NPM ja MongoDb. Selleks avage terminal või käsuviip ja käivitage

sõlm -v

See kontrollib installitud Nodejsi versiooni. Jookse

npm -v

et kontrollida sõlmepaketihalduri (npm) installimist. Vt väljundit

Nüüd, kui oleme kontrollinud, et sõlme ja NPM on installitud, võime jätkata oma projekti seadistamist. Kui sõlme ei installita teie arvutisse, peaksite siin alla laadima teie operatsioonisüsteemiga ühilduva versiooni ja installima enne jätkamist.

Järgmisena peame käitamisega kontrollima, kas MongoDb on installitud

mongo - pöördumine

Millised väljundid ...

Kui MongoDb pole teie arvutisse installitud, peaksite minema MongoDb allalaadimiskeskusesse, enne jätkamist laadige alla ja installige opsüsteemiga ühilduv versioon.

Meie projekti nimetamine

Nüüd on aeg anda oma projektile nimi ja me nimetame seda RESTHubiks. Projekti failide salvestamiseks peame oma failisüsteemis leidma hea asukoha. Isiklikult otsustasin, et kuna ma saan töötada erinevate tööriistade ja programmeerimiskeeltega, hoida oma sõlmpõhised projektid kaustasõlmeprojektidena oma kohalikul draivil. Siin loon oma uue projektikataloogi resthubi järgmiste käskudega

// Liikuge oma sõlmprojektide juurkataloogi
cd C: \ sõlmprojektid
// Looge uue projekti RestHub kataloog
mkdir resthub
// Liikuge kataloogi
cd resthub

Käivitage NodeJs projekt npm-ga init ja järgige projekti seadistamiseks viisardit.

Nõustuge vaikenime ja -versiooniga, kuid muutke kirjeldust ülaltoodud viisil. Ärge unustage muuta autori nime oma nimeks ja nõustuda paketijs.jsoni genereerimiseks vaikelitsentsiga. Ärge muretsege mõne sisendi pärast, kui tegite vea, fail on projekti juurkataloogis saadaval, et saaksite seda soovi korral redigeerida. Peaksite sarnanema ekraaniga ...

Siinkohal peaksite kontrollima, kas teie fail faili package.json on teie projekti juuril saadaval, loetledes failid olenevalt teie operatsioonisüsteemist kas ls-l või dir.

Expressi ja installiserveri installimise aeg

Peame käivitama veebiserveri, et muuta meie API lõpp-punkt brauserile või tööriistale nagu PostMan juurdepääsetavaks, kasutame selle saavutamiseks ExpressJS-i. Kui te ei tunne ExpressJS-i, minge ametlikule veebisaidile, et saada lisateavet, vastasel juhul jätkame. Npm-ga installime selle käsuga projekti projekti Express

npm install express --save

Installimise lõpuleviimine võtab natuke aega, sõltuvalt teie ühenduse kiirusest, kuid lõpuks paigaldatakse expressJs ja selle sõltuvused järgmiselt.

Aitab kõigist neist installatsioonidest, võluritest ja konfiguratsioonidest. Peame hakkama koodi kirjutama. Kui soovite oma eelistatud IDE avada, on minu jaoks Visual Studio kood.

Projektikataloogi avamiseks ja faili index.js loomiseks kasutage oma eelistatud IDE-d

Näete ühte kataloogi node_modules ja ühte faili package.json. Package.json salvestab sõlmeJ projekti konfiguratsiooni koos sõltuvustega. Näete just installitud expressjs -v4.16.3 sõltuvuste all. Installitud sõlmepaketid asuvad node_modules ja me ei peaks selles kataloogis midagi muutma, pigem peaksime eemaldama gitignore, kui me suuname serverihoidlasse. Määrasime oma paketis.json rakenduse sisenemispunktiks index.js. Peame selle faili kohe looma ja oma veebiserveri seadistama.

Looge IDE-s fail index.js ja lisage see kood ...

// FileName: index.js
// Impordi ekspress
lase väljendada = nõuda ('väljenda')
// Käivitage rakendus
lase rakendusel = väljendada ();
// Seadistamise serveri port
var port = protsess.env.PORT || 8080;
// Saada vaike-URL-i jaoks sõnum
app.get ('/', (req, res) => res.send ('Hello World with Express'));
// Käivitage rakendus määratud pordi kuulamiseks
app.listen (port, funktsioon () {
     console.log ("RestHubi käitamine sadamas" + port);
});

Salvestage fail ja käivitage sõlmeindeks terminali aknas. Sa peaksid selle saama

Minge oma brauseris aadressile http: // localhost: 8080 ja peaksite nägema ...

Kiirusta !!! Meie ekspressiserver on nüüd töös. Me tegime seda ... jah! Miski pole nii armas kui see, et saate sujuvalt seadistada. Kui te ei saa punktiga sama tulemust kui minu oma, minge uuesti selle üle, et kontrollida, kas teil ei jäänud punkti või semikoolonit.

Olgu, struktureerime meie rakenduse natuke professionaalselt. Isegi kui kavatsen selle rakendamisel järgida mõnda parimat tava, hoian selle võimalikult lihtsana. See on algajatele mõeldud õpetus ja enamik õpetusi, millega ma varem kokku olen puutunud, kipuvad kõik kokku koondama ühte faili, et rakendada selliseid lihtsaid API-sid. Päris maailmas ei juhtu seda eriti siis, kui teie meeskond valib sellise arhitektuuri nagu MVC muster.

Süstime sellesse rakenduse ülesehitusse natuke MVC-d, et hoida meie failid lahjad ja eraldi probleemid. Peame veel kolm allpool loetletud faili ...

  • api-marsruudid - kõik api lõpp-punkt määratletakse selles failis
  • kontroller - töötleb HTTP-päringuid ja määratleb saadaolevad lõpp-punktid
  • mudel - haldab andmebaasi kihti (taotlus ja vastus)

Looge projekt juur api-route.js juurfail ja lisage sellele järgmine kood.

// Faili nimi: api-route.js
// Initsialiseerige kiirruuter
lase ruuter = nõua ('väljenda'). ruuter ();
// Määrake API vaikeseade
router.get ('/', funktsioon (req, res) {
    res.json ({
        olek: 'API selle töötamine',
        sõnum: 'Tere tulemast RESTHubisse armastusega meisterdatud!'
    });
});
// Ekspordi API marsruute
moodul.exports = ruuter;

Esmalt impordime kiirruuteri, seadsime vaikeliini ja ekspordime mooduli, et saaksime oma rakendusse importida. Selle marsruudi juurdepääsetavaks muutmiseks peame muutma index.js ja lisama sellele paar koodirida.

// Lisage allolev kood kataloogi index.js
// Impordi marsruudid
lase apiRoutes = nõuda ("./ api-marsruudid")
// Kasutage rakenduses Api marsruute
app.use ('/ api', apiRoutes)

taaskäivitage rakenduse server, lõpetades protsessi oma terminalis klahvidega ctrl + c või cmd + c ja alustage uuesti sõlmeindeksiga.

Ülalolevas koodis importisime api-marsruutide faili ja juhendasime oma rakendust kasutama neid marsruute alati, kui kasutaja külastab meie puhul näidet.com/api või http: // localhost: 8080 / api. Kontrollige, kas see töötab, külastades saiti http: // localhost: 8080 / api, peaksite seda ekraani nägema

Jah! See töötas. Võite teha pausi ja juua pudelit vett nagu ma just tegin. Me teeme suuri edusamme, kuid peame sujuvamaks muutmiseks parandama väikest kitsaskohta.

Meie praegune seadistus nõuab serveri taaskäivitamist iga kord, kui teeme oma failides muudatusi või uusi. Mõnikord võib see muutuda stressi tekitavaks ja pettumuseks, kuid see on kiire lahendatud. Seal on sõlme moodul, mis tagab selle kiire parandamise; jälgib teie faile ja pärast muudatuste tegemist taaskäivitab ekspress-serveri. Parim on moodul installida globaalselt, kuna seda võib vaja minna teistes projektides.

npm install -g nodemon
// Macis või Linuxis
sudo npm install -g nodemon

Nüüd, kui olete nodemoni installinud, käivitage selle asemel rakendus nodemoni registriga ja muutke Hello Worldi ja Expressi ja Nodemoni abil vaikse marsruudi teksti ja värskendage brauserit muudatuste kuvamiseks.

Lahe, kui me muudatusi teeme, ei pea me muretsema oma rakendusserveri taaskäivitamise pärast.

MongoDb seadistamine

Ma tahan eeldada, et teil on MongoDb teie arvutisse installitud, minge allalaadimiseks ja installimiseks Mongodbi allalaadimiskeskusesse. Avage teine ​​terminaliaken ja käivitage selle käsuga mongodb-server

mongod

saate sarnase väljundi

MongoDb kasutamiseks hoidke see aken lahti. Minge projekti juurterminali juurde ja installige need paketid

  • mongoose npm install mongoose - salvesta
  • body-parser npm install body-parser --save

Mongoose on Nodejsi pakett Mongodbi modelleerimiseks. See aitab teil hallata mongodbi valideerimist ja äriloogikat Nodejs'is. Lisateavet saate siit.

Keha parser võimaldab teie rakendusel sõeluda saabuvate taotluste andmeid, näiteks vormi andmeid urlencode'i kaudu. Peame selle oma rakendusse importima ja neid kasutama.

Muutke index.js nende ridadega
Värskendus: Olen värskendanud Mongoose'i ühendusliini, et lisada suvand useNewUrlParser ja parandada amortisatsiooni hoiatus

// Impordi keha parser
lase bodyParser = nõuda ('body-parser');
// Import mongoose
lase mongoose = nõuda ('mongoose');
// Seadistage bodyparser postitaotluste käsitlemiseks
app.use (bodyParser.urlencoded ({
   laiendatud: tõsi
}));
app.use (bodyParser.json ());
// Ühendage Mongoose'iga ja määrake ühenduse muutuja
// aegunud: mongoose.connect ('mongodb: // localhost / resthub');
mongoose.connect ('mongodb: // localhost / resthub', {useNewUrlParser: true});
var db = mongoose.ühendus;

Teie täielik index.js peaks välja nägema selline

// Impordi ekspress
las väljendada = nõuda ('väljendama');
// Impordi keha parser
lase bodyParser = nõuda ('body-parser');
// Import mongoose
lase mongoose = nõuda ('mongoose');
// Käivitage rakendus
lase rakendusel = väljendada ();

// Impordi marsruudid
lase apiRoutes = nõuda ("./ api-marsruudid");
// Seadistage bodyparser postitaotluste käsitlemiseks
app.use (bodyParser.urlencoded ({
    laiendatud: tõsi
}));
app.use (bodyParser.json ());
// Ühendage Mongoose'iga ja määrake ühenduse muutuja
mongoose.connect ('mongodb: // localhost / resthub', {useNewUrlParser: true});
var db = mongoose.ühendus;

// Lisatud on DB ühenduse kontroll
kui (! db)
    console.log ("Viga db ühendamisel")
muud
    console.log ("Db edukalt ühendatud")

// Seadistamise serveri port
var port = protsess.env.PORT || 8080;

// Saada vaike-URL-i jaoks sõnum
app.get ('/', (req, res) => res.send ('Hello World with Express'));

// Kasutage rakenduses Api marsruute
app.use ('/ api', apiRoutes);
// Käivitage rakendus määratud pordi kuulamiseks
app.listen (port, funktsioon () {
    console.log ("RestHubi käitamine sadamas" + port);
});

Kõik peaks hästi toimima. Nüüd on aeg seadistada meie kontroller töötlema API päringuid ja mudel, et andmebaasist andmeid salvestada / hankida. Me rakendame lihtsa andmemudeli, mille kaupluste kontaktteave sisaldab järgmisi üksikasju:

  • Nimi
  • E-post
  • Telefon
  • Sugu

Rakendame järgmised tulemusnäitajad

  • GET / api / kontaktide loend sisaldab kõiki kontakte
  • POST / api / kontaktid loovad uue kontakti
  • GET / api / kontaktid / {id} hangib ühe kontakti
  • PUT / api / kontaktid / {id} värskendavad ühte kontakti
  • Kustuta / api / kontaktid / {id} kustutab ühe kontakti

Me kavatseme luua veel kaks (2) faili contactController.js ja contactModel.js ja kleepida need koodid.

// contactController.js
// Impordi kontaktmudel
Kontakt = nõuda ('./ contactModel');
// Indeksitoimingute käsitlemine
export.index = funktsioon (req, res) {
    Kontakt.get (funktsioon (ekslik, kontaktid) {
        if (eks) {
            res.json ({
                olek: "viga",
                teade: viga,
            });
        }
        res.json ({
            staatus: "edu",
            teade: "Kontaktide taastamine õnnestus",
            andmed: kontaktid
        });
    });
};
// Käsitlege kontaktide loomist
export.new = funktsioon (req, res) {
    var kontakt = uus kontakt ();
    kontakt.nimi = vastus.keeli.nimi? req.body.name: contact.name;
    contact.gender = req.body.gender;
    contact.email = req.body.email;
    contact.phone = req.body.phone;
// salvestage kontakt ja kontrollige vigu
    contact.save (funktsioon (ekslik) {
        // if (eksinud)
        // res.json (eksinud);
res.json ({
            teade: 'Uus kontakt loodud!',
            andmed: kontakt
        });
    });
};
// Käsitlege kontaktteavet
export.view = funktsioon (req, res) {
    Kontakt.findById (req.params.contact_id, function (ekslik, kontakt) {
        kui (eks)
            res.send (eksinud);
        res.json ({
            teade: 'Kontaktandmeid laaditakse ..',
            andmed: kontakt
        });
    });
};
// Käsitsege värskenduste kontaktteavet
export.update = funktsioon (req, res) {
Kontakt.findById (req.params.contact_id, function (ekslik, kontakt) {
        kui (eks)
            res.send (eksinud);
kontakt.nimi = vastus.keeli.nimi? req.body.name: contact.name;
        contact.gender = req.body.gender;
        contact.email = req.body.email;
        contact.phone = req.body.phone;
// salvestage kontakt ja kontrollige vigu
        contact.save (funktsioon (ekslik) {
            kui (eks)
                res.json (eksinud);
            res.json ({
                teade: 'Kontaktteavet uuendatud',
                andmed: kontakt
            });
        });
    });
};
// Käsitsege kontakti kustutamist
export.delete = funktsioon (req, res) {
    Contact.remove ({
        _id: req.params.contact_id
    }, funktsioon (ekslik, kontakt) {
        kui (eks)
            res.send (eksinud);
res.json ({
            staatus: "edu",
            teade: 'Kontakt kustutatud'
        });
    });
};

Kontroller määratles meetodi, mis töötleb päringuid ja vastuseid erinevatest API lõpp-punktidest. Esiteks impordime kontaktiModeli ja kasutame selle esinemisjuhte API-l CRUD-i (loomine, toomine, värskendamine ja kustutamine) funktsioonide haldamiseks. Siin on kontaktModel.js kood

// contactModel.js
var mongoose = vaja ('mongoose');
// Seadistamisskeem
var contactSchema = mongoose.Schema ({
    nimi: {
        tüüp: keelpill,
        nõutav: tõsi
    },
    e-post: {
        tüüp: keelpill,
        nõutav: tõsi
    },
    sugu: keel, keel
    telefon: keel, keel
    looma_kuupäev: {
        tüüp: kuupäev,
        vaikimisi: Date.now
    }
});
// Ekspordi kontaktmudel
var Kontakt = moodul.exports = mongoose.model ('kontakt', contactSchema);
module.exports.get = funktsioon (tagasihelistamine, limiit) {
    Contact.find (tagasihelistamine) .limit (limit);
}

Mudelis impordime mongoose, lõime kontaktide andmebaasi skeemi ja eksportisime mooduli kättesaadavaks tegemiseks. Viimane värskendus lisab kontakti marsruute meie APi lõpp-punktidesse. Siin on api-route.js täielik kood

// api-marsruudid.js
// Initsialiseerige kiirruuter
lase ruuter = nõua ('väljenda'). ruuter ();
// Määrake API vaikeseade
router.get ('/', funktsioon (req, res) {
    res.json ({
        olek: 'API selle töötamine',
        sõnum: 'Tere tulemast RESTHubisse armastusega meisterdatud!',
    });
});
// Impordi kontaktikontroller
var contactController = nõuda ('./ contactController');
// Kontaktmarsruudid
ruuter.route ('/ kontaktid')
    .get (contactController.index)
    .post (contactController.new);
ruuter.route ('/ kontaktid /: kontakti_id')
    .get (contactController.view)
    .patch (contactController.update)
    .put (contactController.update)
    .delete (contactController.delete);
// Ekspordi API marsruute
moodul.exports = ruuter;

Vau! See on olnud tõesti pikk sõit. Oleme kokandusega lõpetanud ja on aeg testida oma api lõpp-punkte.

Proovime brauseriga. Külastage saiti http: // localhost: 8080 / api / contact, kus peaksite selle ekraani saama

Näeb hea välja. Meie kollektsioonis pole veel ühtegi kontakti. Peame sellele lisama paar kontakti. Postman on väga hea vahend API lõpp-punkti testimiseks ja silumiseks, kui teil on see arvutisse installitud, hankige see siit. See näeb välja nagu…

Testisin just Postmanis / api / kontakte ja sain sama väljundi.

See toetab ka pikka taotlustüüpide loendit, sealhulgas põhilisi HTTP GET, POST, PUT, DELETE.

Uue kontakti lisamiseks muutke meetod rippmenüüst POST, valige vahekaart Kere, sisestage väärtuse võtme: väärtuse sisestuskastid korpuse all ja klõpsake nuppu Saada, kui olete lõpetanud. Vaadake näidet allpool:

Uue kontakti loomiseks muutke väärtusi. Avage teine ​​sakk ja kasutage GET-i päringut kõigi kontaktide vaatamiseks.

Värskendage brauserit, et näha, kas seda on värskendatud. Peaksite selle ekraani saama.

Olgu, kutid, me oleme jõudnud oma pika sessiooni lõppu. Proovige värskendamist ja kustutamist. Proovige ehitada midagi lahedat ja levitage evangeeliumi. Saate mind tabada twitteris, facebookis, githubis ja saidil @dinyangetoh

Oh, ma peaaegu unustasin lisada lähtefailide jaoks githubi lingi. Võite selle siia kloonida ja lõbutsege suurepäraste rakenduste loomisega.

Uuendatud lingid:

Rakendus Heroku: https://resthub2.herokuapp.com

Github: https://github.com/dinyangetoh/resthub2