Node.js API-ni 30 minut ichida yarating

Node.js yangi boshlanuvchilarni qo'rqitishi mumkin. Ammo uning moslashuvchan tuzilishi va qat'iy ko'rsatmalarning yo'qligi, bu unga qaraganda murakkabroq tuyuladi.

Ushbu o'quv qo'llanma Node.js, Express platformasi va MongoDB uchun tezkor va sodda qo'llanma bo'lib, asosiy REST yo'nalishlari va bazalar bilan o'zaro ishlashga qaratilgan. Siz oddiy API qozonini qurasiz, undan keyin uni har qanday ilova uchun asos sifatida ishlatish mumkin.

Ushbu qo'llanma kim uchun: Siz REST API va CRUD operatsiyalari haqida asosiy tushunchaga ega bo'lishingiz va JavaScript-ning asosiy bilimlariga ega bo'lishingiz kerak. Men ES6-ni (asosan yog 'ko'rsatkichlari funktsiyasidan) foydalanaman, ammo juda murakkab narsa yo'q.

Ushbu qo'llanmada siz yozuvlarni yozib olish uchun orqa qism skeletini yaratasiz - Google Keep deb o'ylang. O'zingizning qaydlaringizda CRUD-ning to'rtta amalini bajarishingiz mumkin: yaratish, o'qish, yangilash va o'chirish.

Sozlash

Agar sizda tugun o'rnatilmagan bo'lsa, mana bu yerga qarang.

Yangi katalogda npm init-ni ishga tushiring va ko'rsatmalarga amal qiling, ilova dasturingizga 'sezilarli' (yoki sizga yoqishi mumkin bo'lgan boshqa) nomini bering.

n / soat start

Bu amalga oshirilgandan so'ng, sizning katalogingizga o'tishga tayyor pack.json bo'lishi kerak. Bu sizning loyihangiz uchun zarur bo'lgan qaramlikni o'rnatishni boshlashingiz mumkin degan ma'noni anglatadi.

Siz Express-ni o'zingizning ramkangiz sifatida, MongoDB-ni ma'lumotlar bazasi sifatida va JSON so'rovlarini bajarishda yordam beradigan "body-analizator" to'plamidan foydalanmoqchisiz.

npm o'rnatish - ekspress mongodb@2.2.16 basseynni tahlil qiluvchi

Men shuningdek, Nodemon-ni devlarga qaramlik sifatida o'rnatishni maslahat beraman. Bu oddiy kichik paket, fayllar o'zgarganda serveringizni avtomatik ravishda qayta yoqadi.

Agar siz yugursangiz:

npm o'rnatish --save-dev nodemon

Keyin pack.json-ga quyidagi skriptni qo'shishingiz mumkin:

// pack.json
  "skriptlar": {
    "dev": "nodemon server.js"
  },

Sizning to'liq pack.json quyidagicha ko'rinishi kerak:

// pack.json
{
  "name": "taniqli",
  "versiya": "1.0.0",
  "tavsif": "",
  "main": "server.js",
  "skriptlar": {
    "dev": "nodemon server.js"
  },
  "muallif": "",
  "litsenziya": "ISC",
  "qaramliklar": {
    "tanani tahlil qiluvchi": "^ 1.15.2",
    "express": "^ 4.14.0",
    "mongodb": "^ 2.2.16"
  },
  "devDependents": {
    "nodemon": "^ 1.11.0"
  }
}

Endi siz o'z server.js faylingizni yaratishingiz va o'zingizning API-ni yaratishni boshlashingiz mumkin.

Bizning Server

O'zingizning barcha bog'liqliklaringizni server.js-da talab qilishdan boshlaylik.

// server.js
const express = zarur ('express');
const MongoClient = talab qilish ('mongodb'). MongoClient;
const bodyParser = zarur ('tana tahlil qiluvchi');
const app = express ();

Siz o'zingizning ma'lumotlar bazangiz bilan o'zaro ishlash uchun MongoClient-dan foydalanasiz. Shuni ham unutmangki, siz o'zingizning ilovangizni Express, sizning ramkangizning namunasi sifatida ishga tushirasiz.

O'zingizning serveringizni ishga tushirishingiz kerak bo'lgan eng oxirgi narsa, bu sizning ilovangizga HTTP so'rovlarini tinglashni boshlashingizni aytadi.

Siz portni belgilashingiz va tinglashni quyidagicha boshlashingiz mumkin:

// server.js
const port = 8000;
app.listen (port, () => {
  console.log ('Biz "+ portda yashaymiz);
});

Endi agar siz npm run dev (yoki Nodemon-ni o'rnatmagan bo'lsangiz server.js node) ni ishlatsangiz, terminalda "Biz 8000 portda jonli" degan yozuvni ko'rishingiz kerak.

Sizning serveringiz ishlamoqda. Ammo bu ko'p narsa qilmaydi. Yoki biron bir narsa, albatta.

Buni tuzataylik.

CRUDdy yo'nalishlari

Ushbu misol uchun siz 4 marshrutni qurmoqchisiz; eslatmani YARATISH, eslatmalaringizni O'QISh, eslatmani UPDATE va DELETE uchun.

Bu sizga Node bilan deyarli har qanday asosiy marshrutni qanday tuzish haqida yaxshi fikr beradi.

O'zingizning API-ni sinab ko'rish uchun so'rovlar yuborishda mijozga taqlid qilishingiz kerak. Buning uchun siz Postman deb nomlangan ajoyib dasturdan foydalanasiz. Bu sizga oddiy HTTP so'rovlarini maxsus jismlar va parametrlar bilan amalga oshirishga imkon beradi.

Postmanni o'rnating va marshrutlaringizni sozlashga kirishaylik.

Super uyushgan

Ko'pgina Node.js darsliklari (va ko'plab haqiqiy dasturlar) barcha yo'nalishlarini bitta katta train.js fayliga joylashtiradi. Bu meni bir oz bezovta qiladi. Bundan farqli o'laroq, fayllaringizni alohida papkalarga bo'lish yaxshi o'qishga olib keladi va katta ilovalarni boshqarishni osonlashtiradi.

Sizda katta ilovangiz yo'q, lekin buni to'g'ri qilaylik. Quyidagi kataloglarni yarating: ichidagi marshrutlar papkasi, ichida index.js va note_routes.js fayli joylashgan ilova papkasi.

Boshqacha qilib aytganda: root> ilova> marshrutlar> index.js va note_routes.js.

mkdir ilovasi
CD ilovasi
mkdir marshrutlari
CD marshrutlari
sensorli indeks.js
note_routes.js ga teging

Ushbu kataloglar oddiy kichkina ilovangiz uchun haddan tashqari ko'p bo'lib tuyulishi mumkin, ammo eng yaxshi tajribalardan boshlash har doim yaxshi.

Sizning birinchi marshrutingiz

CRUD yaratishda C dan boshlaylik. Qanday qilib eslatma yaratasiz?

Xo'sh, buni amalga oshirishdan oldin, siz biroz ko'proq infratuzilmani qurishingiz kerak. Express-da, yo'nalishlar Express misolini va ma'lumotlar bazasini argument sifatida qabul qiladigan funktsiyaga o'ralgan.

Shunga o'xshash:

// yo'nalishlar / note_routes.js
module.exports = funktsiya (ilova, db) {
};

Keyin ushbu funktsiyani index.js orqali eksport qilishingiz mumkin:

// yo'nalishlar / index.js
const noteRoutes = zarur ('./ note_routes');
module.exports = funktsiya (ilova, db) {
  noteRoutes (ilova, db);
  // Boshqa yo'nalish guruhlari bu erga, kelajakda borishlari mumkin
};

Keyin uni server.js-da foydalanish uchun import qiling:

// server.js
const express = zarur ('express');
const MongoClient = talab qilish ('mongodb'). MongoClient;
const bodyParser = zarur ('tana tahlil qiluvchi');
const app = express ();
const port = 8000;
talab qilish ('./ app / train') (app, {});
app.listen (port, () => {
  console.log ('Biz "+ portda yashaymiz);
});

Shuni esda tutingki, sizda ma'lumotlar bazasi hali o'rnatilmaganligi sababli siz bo'sh ob'ektni o'tkazmoqdasiz.

Xo'sh, endi siz o'zingizning CREATE yo'nalishingizni qilishingiz mumkin.

Sintaksis oddiy:

// note_routes.js
module.exports = funktsiya (ilova, db) {
  app.post ('/ notes', (req, res) => {
    // Siz qaydingizni shu erda yaratasiz.
    res.send ('Salom')
  });
};

Ilova '/ notes' yo'liga yuborilgan so'rovni qabul qilganda, so'rov ob'ektida (so'rov parametrlari yoki JSON parametrlarini o'z ichiga olgan) va javob ob'ektida (javob berish uchun ishlatiladigan) qo'ng'iroqni qaytarish ichidagi kodni bajaradi.

Buni Postman yordamida mahalliy manzilga POST so'rovini yuborish orqali sinab ko'rishingiz mumkin: 8000 / note.

Siz

Ajoyib! Siz birinchi haqiqiy marshrutni yaratdingiz.

Keyingi qadam so'rovingizga ba'zi parametrlarni qo'shish va ularni API-da qayta ishlash va nihoyat ma'lumotlar bazangizga qo'shishdir.

Parametrlarni talab qiling

Postman-da, tanaga yorlig'iga o'ting va x-www-form-urlencoded radio tugmachasini tanlagandan so'ng, ba'zi bir qiymat juftlarini qo'shing.

Bu sizning so'rovingizga kodlangan shakl ma'lumotlarini qo'shadi, ularni API bilan qayta ishlashingiz mumkin.

Siz mendan ko'proq ijodiy bo'lishga harakat qilishingiz mumkin.

Endi note_routes.js-da tanadan chiqishga ruxsat bering.

// note_routes.js
module.exports = funktsiya (ilova, db) {
  app.post ('/ notes', (req, res) => {
    konsol.log (req.body)
    res.send ('Salom')
  });
};

Pochtachi so'rovini yuborishga urinib ko'ring, shunda siz aniqlanmaysiz.

Afsuski, Express URL kodlangan shakllarini mustaqil ravishda qayta ishlay olmaydi. Ammo siz bodibilding tahlil qiluvchi paketini o'rnatdingiz ...

// server.
const express = zarur ('express');
const MongoClient = talab qilish ('mongodb'). MongoClient;
const bodyParser = zarur ('tana tahlil qiluvchi');
const app = express ();
const port = 8000;
app.use (bodyParser.urlencoded ({kengaytirilgan: haqiqiy}));
talab qilish ('./ app / train') (app, {});
app.listen (port, () => {
  console.log ('Biz "+ portda yashaymiz);
});

Endi siz tanani terminalda ob'ekt sifatida ko'rishingiz kerak.

{sarlavha: 'Mening eslatma sarlavham', tanasi: 'Qanday ajoyib eslatma.' }

Oldingi marshrutingizga so'nggi qadam: ma'lumotlar bazasini yarating va keyin o'z ma'lumotingizni qo'shing.

Mongo ma'lumotlar bazasini o'rnatishning eng oson usuli mLab orqali amalga oshiriladi: u eng kichik o'lcham uchun bepul va sozlash juda tez.

Hisob qaydnomasini yaratganingizdan va MongoDB-ni o'rnatgandan so'ng, foydalanuvchi nomi va parol bilan ma'lumotlar bazasiga foydalanuvchini qo'shing.

keyin bu erda URL manzilini oling (ikkinchisi):

Va sizning loyihangizning ildizida config katalogida db.js faylini yarating.

mkdir konfiguratsiya
CD konfiguratsiyasi
teginish db.js

Ichkarida URL manzilini qo'shing:

modul.exports = {
  URL: BU YERINGIZNING BU YERGA
};

URL-ga foydalanuvchi nomingiz va parolingizni (ma'lumotlar bazangiz foydalanuvchisi emas, balki mLab hisob qaydnomangizni) qo'shishni unutmang. (Agar siz ushbu loyihani Githubga topshirgan bo'lsangiz, xuddi shunday .ignignore faylini ham qo'shing, shunda siz parolingizni hamma bilan baham ko'rmaysiz.)

Endi server.js-da siz MB-ga ulanish uchun MongoClient-dan foydalanishingiz va undan ilovangizni sozlash uchun foydalanishingiz mumkin:

// server.js
const express = zarur ('express');
const MongoClient = talab qilish ('mongodb'). MongoClient;
const bodyParser = zarur ('tana tahlil qiluvchi');
const db = zarur ('./ config / db');
const app = express ();
const port = 8000;
app.use (bodyParser.urlencoded ({kengaytirilgan: haqiqiy}));
MongoClient.connect (db.url, (err, ma'lumotlar bazasi) => {
  if (err) return console.log (err)
  demand ('./ app / train') (ilova, ma'lumotlar bazasi);
  app.listen (port, () => {
    console.log ('Biz "+ portda yashaymiz);
  });
})

Agar siz MongoDB (3.0+) ning so'nggi versiyasidan foydalanayotgan bo'lsangiz, uni quyidagicha o'zgartiring:

// server.js
const express = zarur ('express');
const MongoClient = talab qilish ('mongodb'). MongoClient;
const bodyParser = zarur ('tana tahlil qiluvchi');
const db = zarur ('./ config / db');
const app = express ();
const port = 8000;
app.use (bodyParser.urlencoded ({kengaytirilgan: haqiqiy}));
MongoClient.connect (db.url, (err, ma'lumotlar bazasi) => {
  if (err) return console.log (err)
                      
  // To'plam nomini emas, balki ma'lumotlar bazasi nomini qo'shganingizga ishonch hosil qiling
  const database = database.db ("note-api")
  demand ('./ app / train') (ilova, ma'lumotlar bazasi);
  app.listen (port, () => {
    console.log ('Biz "+ portda yashaymiz);
  });
})

(3.0-ni tuzatgani uchun Aleks Stroulgerga rahmat)

Bu sizning infratuzilmani sozlashning eng oxirgi! Bu erdan marshrut qurilishi.

Ma'lumotlar bazangizga qo'shish

MongoDB ma'lumotlarni to'plamlarda saqlaydi - ular qanday yangilanadi. Sizning holatlaringizda, siz o'zingizning eslatmalaringizni to'plamda saqlashni xohlaysiz - siz buni taxmin qildingiz - eslatmalar.

O'zingizning ma'lumotlar bazangizga marshrutlaringizda db argumenti sifatida kirganingiz sababli, unga quyidagicha kirishingiz mumkin:

db. yig'ish ('eslatmalar')

Qayd yaratish sizning to'plamingizga qo'ng'iroq qo'shib qo'yish kabi oddiy:

const note = {matn: req.body.body, sarlavha: req.body.title}
  db.collection ('notes'). kiritish (eslatma, (xato, natijalar) => {
}

Qo'shish tugallangandan so'ng (yoki biron bir sababga ko'ra muvaffaqiyatsiz bo'lsa), siz xato yoki yangi yaratilgan eslatma ob'ektini yuborishni xohlaysiz. To'liq note_routes.js:

// note_routes.js
module.exports = funktsiya (ilova, db) {
  const to'plami =
  app.post ('/ notes', (req, res) => {
    const note = {matn: req.body.body, sarlavha: req.body.title};
    db.collection ('notes'). kiritish (eslatma, (xato, natija) => {
      agar (xato) {
        res.send ({'error': 'Xatolik yuz berdi'});
      } else {
        res.send (result.ops [0]);
      }
    });
  });
};

Buni sinab ko'ring! "Postman" ga x-www-form-urlencoded POST so'rovini yuboring, sarlavha va "Body" yorlig'i ostida.

Javob quyidagicha ko'rinishi kerak:

Agar siz mLab-ga kirsangiz, yaratilgan ma'lumotlaringizni ma'lumotlar bazasida ko'rishingiz kerak.

O'qish marshrutingiz

Endi siz tezlikni biroz ko'tarishingiz mumkin.

Siz hozirgina yaratgan qaydni mahalliyhostga o'tish orqali qaytarib olmoqchi ekaningizni ayting: 8000 / notes / {id}. Bunday holda, bu mahalliy joy bo'ladi: 8000 / note / 585182bd42ac5b07a9755ea3.

(Agar eslatmalaringizdan birida identifikatoringiz bo'lmasa, mLab-ni tekshirishingiz yoki yangisini yaratishingiz mumkin).

Mana note_routes.js-da quyidagicha ko'rinadi:

// note_routes.js
module.exports = funktsiya (ilova, db) {
  app.get ('/ notes /: id', (req, res) => {
    
  });
  app.post ('/ notes', (req, res) => {
    const note = {matn: req.body.body, sarlavha: req.body.title};
    db.collection ('notes'). kiritish (eslatma, (xato, natija) => {
      agar (xato) {
        res.send ({'error': 'Xatolik yuz berdi'});
      } else {
        res.send (result.ops [0]);
      }
    });
  });
};

Xuddi oldingidek, siz ma'lumotlar bazangizdagi qaydlar to'plamiga qo'ng'iroq qilmoqchisiz. Mana, bu aniq deb nomlangan findOne.

// note_routes.js
module.exports = funktsiya (ilova, db) {
  app.get ('/ notes /: id', (req, res) => {
    const details = {'_id': };
    db.collection ('notes'). findOne (tafsilotlar, (xato, element) => {
      agar (xato) {
        res.send ({'error': 'Xatolik yuz berdi'});
      } else {
        res.send (element);
      }
    });
  });
app.post ('/ notes', (req, res) => {
    const note = {matn: req.body.body, sarlavha: req.body.title};
    db.collection ('notes'). kiritish (eslatma, (xato, natija) => {
      agar (xato) {
        res.send ({'error': 'Xatolik yuz berdi'});
      } else {
        res.send (result.ops [0]);
      }
    });
  });
};

Siz identifikatorni URL parametrlaridan req.params.id orqali olishingiz mumkin. Ammo, agar siz yuqoridagi <> qatoriga shunchaki o'tishga harakat qilsangiz, u ishlamaydi.

MongoDB shunchaki identifikatorni sim sifatida emas, balki ID ob'ekti sifatida yoki uni chaqiradigan sifatida ObjectID talab qiladi.

Xavotir olmang, bu oson tuzatish. To'liq kod bu erda:

// note_routes.js
var ObjectID = talab qilish ('mongodb'). ObjectID;
module.exports = funktsiya (ilova, db) {
  app.get ('/ notes /: id', (req, res) => {
    const id = req.params.id;
    const details = {'_id': yangi ObjectID (id)};
    db.collection ('notes'). findOne (tafsilotlar, (xato, element) => {
      agar (xato) {
        res.send ({'error': 'Xatolik yuz berdi'});
      } else {
        res.send (element);
      }
    });
  });
app.post ('/ notes', (req, res) => {
    const note = {matn: req.body.body, sarlavha: req.body.title};
    db.collection ('notes'). kiritish (eslatma, (xato, natija) => {
      agar (xato) {
        res.send ({'error': 'Xatolik yuz berdi'});
      } else {
        res.send (result.ops [0]);
      }
    });
  });
};

Qayd ID raqamingizdan birini sinab ko'ring va u quyidagicha ko'rinishi kerak:

Sizning DELETE marshrutingiz

Ob'ektni yo'q qilish aslida ob'ektni topishga o'xshaydi. Siz faqat findOne o'rniga o'chirish funktsiyasidan foydalanasiz. To'liq kod bu erda. Men sizning GETingizdan nimasi bilan farq qilishini ta'kidladim:

// note_routes.js
// ...
  app.delete ('/ notes /: id', (req, res) => {
    const id = req.params.id;
    const details = {'_id': yangi ObjectID (id)};
    db.collection ('notes') olib tashlang (tafsilotlar, (xato, element) => {
      agar (xato) {
        res.send ({'error': 'Xatolik yuz berdi'});
      } else {
        res.send ('Eslatma' + id + 'o'chirildi!');
      }
    });
  });
// ...

UPDATE Yo'lingiz

Oxirgisi! PUT asosan READ va CREATE o'rtasidagi gibriddir. Siz ob'ektni topasiz, keyin uni mos ravishda yangilang. Agar siz o'zingizning yagona eslatmangizni o'chirib tashlasangiz, boshqa yozuvni tayyorlash vaqti keldi!

Kod:

// note_routes.js
// ...
  app.put ('/ notes /: id', (req, res) => {
    const id = req.params.id;
    const details = {'_id': yangi ObjectID (id)};
    const note = {matn: req.body.body, sarlavha: req.body.title};
    db.collection ('notes'). yangilash (tafsilotlar, eslatma, (xato, natija) => {
      agar (xato) {
          res.send ({'error': 'Xatolik yuz berdi'});
      } else {
          res.send (eslatma);
      }
    });
  });
// ...

Endi siz istalgan qaydlaringizni yangilashingiz mumkin, masalan:

Ushbu kodning nomukammalligiga e'tibor bering - agar siz tanani yoki sarlavhani bermasangiz, PUT so'rovi ma'lumotlar bazasidagi eslatmada ko'rsatilgan joylarni bekor qiladi.

Maydonlarni agar ular so'rovda bo'lsa, ularni yangilash uchun siz osonlikcha ba'zi shartli mantiqiy narsalarni qo'shishingiz mumkin - men buni shunchaki sodda saqlash uchun qoldirdim.

API tugadi

Bo'ldi shu! Sizda to'rtta CRUD operatsiyasining har biri bilan ishlaydigan tugun API mavjud.

Ushbu darslikning maqsadi sizga Express, Node va MongoDB bilan tanishish darajasini berish edi - siz oddiy ilovangizni yanada murakkab loyihalarni ishga tushirish paneli sifatida ishlatishingiz mumkin.

Kelgusida turli xil tillar va ramkalarda oddiy sodda API'larni yaratish uchun darsliklar yozaman. Agar qiziqsangiz, quyidagi tugmani bosing!

Agar ushbu dars sizga biron bir yordam bergan bo'lsa, iltimos, quyida joylashgan yashil yurakka uring - bu juda ko'p narsani anglatadi. Har qanday fikr yoki savol bilan menga sharh qoldirishingiz mumkin.

O'qiganingiz uchun rahmat!