Ноде.јс је ЈаваСцрипт рунтиме отвореног кода изграђен на Цхроме-овом в8 мотору који вам омогућава да покренете ЈаваСцрипт код ван прегледача.
Његов модел догађаја, екосистем и брзина учинили су Ноде.јс једним од најтраженијих и најкоришћенијих времена извођења за апликације на страни сервера.
Већина Ноде.јс АПИ сервера користи Екпресс или неки други оквир. Међутим, можете креирати и једноставан Ноде.јс АПИ без оквира у само неколико корака.
Корак 1: Подешавање вашег развојног окружења
Направите директоријум пројекта и цд у њега покретањем:
мкдир нодејс-апи
цд нодејс-апи
Затим иницијализујте нпм у свом пројекту покретањем:
нпм инит -и
Овај ЦРУД АПИ ће садржати употребу МонгоДБ, НоСКЛ базе података, и његовог популарног ОДМ-а, мунгоосе.
Покрените следећу команду да бисте инсталирали Мунгос:
нпм инсталирај Мунгос
Затим креирајте а сервер.јс датотеку у основном директоријуму вашег пројекта и додајте блок кода испод да бисте креирали сервер:
конст хттп = захтевају("хттп");
конст сервер = хттп.цреатеСервер((рек, рес) => {});
сервер.листен (3000, () => {
конзола.Пријава(`Сервер ради`);
});
Овај блок кода увози хттп модул, основни модул Ноде.јс. хттп модул омогућава Ноде.јс да преноси податке преко ХТТП-а. Овај модул садржи методе потребне за креирање сервера.
Затим позива хттп модул цреатеСервер метод који креира и враћа инстанцу сервера. Тхе цреатеСервер метода узима функцију повратног позива са објектом захтева и одговора као параметрима.
Затим, код позива тхе слушај метод на враћеној инстанци сервера. Ово омогућава серверу да почне да слуша саобраћај на датом порту. Тхе слушај метода покреће повратни позив — други аргумент — када успе.
На крају, креирајте два директорија под називом руте и модели у основном директоријуму вашег пројекта. Тхе руте фолдер ће садржати логику рутирања за ваш АПИ, док модел садржаће све што се тиче базе података.
Корак 2: Повезивање ваше апликације са базом података
У сервер.јс, увоз Мунгос:
конст мунгоосе = захтевају("Мунгос");
Звати повезати метод на Мунгос и проследите свој МонгоДБ УРИ као аргумент:
мунгоосе.цоннецт("МонгоДБ_УРИ")
Корак 3: Креирање АПИ модела
Креирајте ЦРУД АПИ за једноставну апликацију за блог. У вашем модели фолдер, креирајте а блогМодел.јс датотеку и додајте следећи код у своју датотеку:
конст мунгоосе = захтевају("Мунгос");
конст блогСцхема = мунгоосе. Шема({
наслов: {
тип: Низ,
потребно: [тачно, "Блог мора имати наслов"],
},
тело: {
тип: Низ,
потребно: [тачно, "Блог мора имати тело"],
},
});
модул.извоза = монгоосе.модел("Блог", блогСцхема);
Блок кода изнад креира модел мунгоса са два својства и мапира их у МонгоДБ базу података.
Оба својства у овом моделу имају а Низ тип са потребан подешен на истинито. Пратеће поруке о грешци ће се приказати ако тело захтева не садржи ниједно од својстава.
Последња линија креира и извози модел мунгоса позивањем модел метод на Мунгос. Проследите назив модела (Блог) као први аргумент и шема (блогСцхема) као други аргумент.
Корак 4: Имплементација рутирања у вашој апликацији
Без помоћи од оквири попут Екпресса, мораћете ручно да креирате логику за обраду сваког захтева упућеног вашем АПИ-ју.
Прво, креирајте а блогРоутес.јс фајл у вашем руте фолдер, а затим увезите модел блога:
конст Блог = захтевају("../моделс/блогМодел");
Затим креирајте асинхрони рутер функција, пас рек и рес као параметре и извезите функцију:
конст рутер = асинцфункција (рек, рес) {};
модул.извоза = рутер;
Ова функција ће садржати сву вашу логику рутирања.
Затим ћете имплементирати логику рутирања рута по рута.
ГЕТ Роутес
Додајте блок кода испод у свој рутер функцију за спровођење ДОБИТИ руковалац рута за захтеве упућене ка /api/blogs:
// ГЕТ: /апи/блогс
иф (рек.урл "/api/blogs"&& рек.метход "ДОБИТИ") {
// преузми све блогове
конст блогови = чекати Блог.финд();// комплет тхе статус код исадржаја-тип
рес.вритеХеад (200, { "Тип садржаја": "апплицатион/јсон" });
// слање података
рес.крај(ЈСОН.стрингифи(блогови));
}
Горњи блок кода проверава урл и методом својства објекта захтева. Затим преузима све блогове из базе података преко наћи метода на моделу мунгоса (Блог).
Следеће, позива на вритеХеад метод на рес, објекат одговора. Овај метод шаље заглавље одговора са три аргумента: статусни код, опциону статусну поруку и заглавља. Тхе 200 статусни код представља успешан одговор и тип садржаја за овај АПИ позив је подешен на апплицатион/јсон.
На крају, затворите захтев да бисте осигурали да сервер не виси тако што ћете позвати крај метод на рес. Позив на ЈСОН.стрингифи претвара у блогови објекат на ЈСОН стринг и прослеђујући га у крај метода га враћа као тело одговора.
Додајте блок кода испод у свој рутер функцију за спровођење ДОБИТИ руковалац руте за један ресурс:
// ГЕТ: /апи/блогс/:ид
иф (рек.урл.матцх(/\\/апи\\/блогс\\/([0-9]+)/) && рек.метход "ДОБИТИ") {
покушати {
// издвајање ИД-а из урл-а
цонст ид = рек.урл.сплит("/")[3];// преузми блог из ДБ
конст блог = чекати Блог.финдБиИд (ид);
ако (блог) {
рес.вритеХеад (200, { "Тип садржаја": "апплицатион/јсон" });
рес.крај(ЈСОН.стрингифи(блог));
} друго {
бацитиНоваГрешка(„Блог не постоји“);
}
} улов (грешка) {
рес.вритеХеад (404, { "Тип садржаја": "апплицатион/јсон" });
рес.крај(ЈСОН.стрингифи({ порука: грешка }));
}
}
Овај код користи утакмица метод, који узима израз регуларног израза као аргумент, да провери да ли се УРЛ поклапа са форматом: /api/blogs/.
Затим извуците ид имовине из урл стринг позивањем итс разделити методом. Овај метод узима образац као аргумент (/), дели стринг на основу шаблона и враћа низ. Трећи елемент тог низа је ид.
На крају, преузмите документ са подударањем ид из ваше базе података. Ако постоји, пошаљите а код одговора 200, затворите захтев и пошаљите преузети блог. Ако не постоји, избаците грешку и пошаљите је као одговор у блоку цатцх.
ПОСТ Роуте
Додајте блок кода испод у функцију рутера да бисте имплементирали ПОШТА руковалац руте:
// ПОСТ: /апи/блогс/
иф (рек.урл "/api/blogs"&& рек.метход "ПОШТА") {
покушати {
нека тело = "";// Слушај догађај са подацима
рек.он("података", (комад) => {
боди += цхунк.тоСтринг();
});// Слушај крајдогађај
рек.он("крај", асинц () => {
// Креирај блог
дозволити блог = Нова Блог(ЈСОН.парсе (тело));
// Сачувај у ДБ
чекати блог.саве();
рес.вритеХеад (200, { "Тип садржаја": "апплицатион/јсон" });
рес.крај(ЈСОН.стрингифи(блог));
});
} улов (грешка) {
конзола.лог (грешка);
}
}
Објекат захтева имплементира Ноде.јс РеадаблеСтреам интерфејс. Овај ток емитује а података и један крај догађај који вам омогућава приступ подацима из тела захтева.
Овај код ослушкује догађај података и обрађује га тако што га конвертује у стринг и спаја у тело променљива. У крај обрађивач догађаја, ствара а Блог инстанца са рашчлањеним низом тела. Затим чува нови блог, шаље статусни код и заглавље садржаја и затвара захтев.
ПУТ Роуте
Додајте блок кода испод у функцију рутера да бисте имплементирали СТАВИТИ руковалац руте:
// ПУТ: /апи/блогс/:ид
иф (рек.урл.матцх(/\\/апи\\/блогс\\/([0-9]+)/) && рек.метход "СТАВИТИ") {
покушати {
// издвајање ИД-а из урл-а
цонст ид = рек.урл.сплит("/")[3];
нека тело = "";рек.он("података", (комад) => {
боди += цхунк.тоСтринг();
});
рек.он("крај", асинц () => {
// Пронађи и ажурирањедокумент
дозволити упдатедБлог = чекати Блог.финдБиИдАндУпдате (ид, ЈСОН.парсе (тело), {
Нова: истинито,
});
рес.вритеХеад (200, { "Тип садржаја": "апплицатион/јсон" });
рес.крај(ЈСОН.стрингифи(упдатедБлог));
});
} улов (грешка) {
конзола.лог (грешка);
}
}
Обрађивач ПУТ захтева је скоро идентичан ПОШТА руковалац захтева, осим што издваја ид имовине из урл да ажурирате релевантни блог.
ДЕЛЕТЕ Роуте
Додајте блок кода испод у функцију рутера да бисте имплементирали своју ИЗБРИШИ руковалац руте:
// ИЗБРИШИ: /апи/блогс/:ид
иф (рек.урл.матцх(/\\/апи\\/блогс\\/([0-9]+)/) && рек.метход "ИЗБРИШИ") {
покушати {
цонст ид = рек.урл.сплит("/")[3];
// Избриши блог из ДБ
чекати Блог.финдБиИдАндДелете (ид);
рес.вритеХеад (200, { "Тип садржаја": "апплицатион/јсон" });
рес.енд (ЈСОН.стрингифи({ порука: "Блог је успешно избрисан" }));
} улов (грешка) {
рес.вритеХеад (404, { "Тип садржаја": "апплицатион/јсон" });
рес.крај(ЈСОН.стрингифи({ порука: грешка }));
}
}
Овај блок кода издваја ид од урл, брише документ са подударањем ид, шаље статусни код и заглавља и затвара захтев.
Коначно, увоз рутер у вашем сервер.јс датотеку и позовите своју рутер функција, пролаз рек и рес као аргументи:
конст рутер = захтевају("./роутес/блогРоутес");
конст сервер = хттп.цреатеСервер((рек, рес) => {
рутер (рек, рес);
});
Ово омогућава вашем серверу да пресретне и обрађује захтеве на одговарајући начин.
Завршени пројекат можете пронаћи у овом ГитХуб спремиште.
Коришћење оквира Ноде.јс
Иако је могуће креирати веб АПИ ручно, то може бити тежак задатак. Мораћете да се уверите да сте покрили много рубних случајева и да је боље да ваш код буде без грешака.
Током година, програмери су изградили оквире као што су ЕкпрессЈС, НестЈС, Фастифи, итд., Да би то учинили много лакшим.