Buat API CRUD Anda sendiri di Express dan MySQL: bagian satu

Halo semuanya. Untuk mengantisipasi dimulainya kursus "Pengembang JavaScript Fullstack" , kami ingin membagikan sedikit materi yang ditulis oleh penulis lepas kami.



Express adalah salah satu kerangka kerja web paling populer yang mendukung perutean, kelas menengah dan sistem templat. Membuat backend di Node.js tanpa Express pada tahun 2020 adalah kegiatan yang agak aneh, karena Express adalah kerangka kerja de facto untuk membangun aplikasi web di Node.js.
Hari ini kita akan mencoba membuat API CRUD sederhana menggunakan database MySQL. Pembaca Node.js yang berpengalaman akan bertanya, di mana MongoDB, yang dengannya Node.js biasanya digunakan bersama-sama, tetapi saya akan segera mengatakan artikel ini lebih untuk pengembang PHP yang ingin sedikit menyentuh Node.js, dan untuk mengurangi transisi ke ekosistem baru, kami kita akan menggunakan MySQL. Kami akan membuat API untuk aplikasi Todo sederhana, seandainya seseorang ingin melampirkan todo-nya (dan itu tidak masalah apakah itu ditulis dengan Bereaksi atau tidak), lampirkan sedikit punggung dan mainkan dengan itu.


"Arsitektur" dan esensi dari aplikasi kita



Dalam aplikasi kami akan dimungkinkan untuk membuat, menerima, memperbarui, dan menghapus Todo. Secara umum, kita akan memiliki satu set fungsi CRUD minimal (membuat pembaruan baca dihapus).

Pada akhirnya, kami akan menggabungkan aplikasi dengan aplikasi di Bereaksi dan kami akan menguji semuanya.

Pertama, saya akan memberikan struktur file aplikasi:



Selanjutnya, saya akan memberikan tabel tindakan dan metode yang ada di aplikasi kita:

MetodeUrlTindakan
Dapatkan/ penawaranmendapatkan semua kasing
Dapatkan/ penawaran / 2Mendapatkan id dengan nomor 2
Pos/ penawaranmenambahkan case baru
Taruh/ penawaran / 3Perbarui pengguna dengan id = 3
MENGHAPUS/ penawaran / 3hapus pengguna dengan id = 3
MENGHAPUS/ penawaranhapus semua pengguna

Membuat Aplikasi Node.js Anda

Buka direktori favorit Anda, luncurkan terminal dan buat aplikasi Anda. Ngomong-ngomong, mungkin jelas dari judul bahwa Node.js harus sudah diinstal. Jika Anda belum melakukannya, maka ini tidak dapat diunduh dari tautan dari sini.

    $ mkdir CRUD_API
    $ cd CRUD_API

Selanjutnya, Anda perlu menginisialisasi aplikasi kami menggunakan npm init . Karena aplikasi kami lebih merupakan tes dan pelatihan, saya akan menggunakan perintah yang akan mengisi semua data default agar tidak membuang waktu pada detail kecil:

 npm init -y
 

Jika itu, maka dengan tangan package.jsonAnda di dalam Anda dapat mengubah data ke yang Anda butuhkan: repositori github, tag, penulis, dll.

Maka kita perlu meletakkan semua paket yang diperlukan agar aplikasi berfungsi:

  npm i express mysql body-parser --save


Jika Anda akan mengirim pengembangan Anda ke github nanti, Anda harus membuat file tersembunyi .gitignoreagar tidak menarik node_modules terberat dan memalukan diri Anda . Kami menulis:

    touch .gitignore 
    code .gitignore 

Kami masukkan di sana node_modules, nanti dalam file ini Anda dapat memasukkan nama folder dan file yang ingin Anda lihat nanti di server jauh.

Penyiapan dasar Express


Di folder root proyek, buat file server.js:

    const express = require("express");
    const bodyParser = require("body-parser");
    
    const app = express();
    
    //     json
    app.use(bodyParser.json());
    
    //    : application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: true }));
    
    //   response - request
    app.get("/", (req, res) => {
      res.json({ message: "    " });
    });
    
    //  ,   
    app.listen(3001, () => {
      console.log("   3001 ");
    });

Sekarang kita dapat memulai server dengan:

node server.js

Kita perlu Express untuk membuat api kita, dan paket body-parser membantu kita mem-parsing permintaan dan membuat req.bodyyang berguna untuk perutean.

Sekarang server kami dapat melakukan hal berikut:

  • Buat aplikasi Express yang menjadikan body-parser midlever menggunakan app.use ()
  • kami punya get sederhana, hanya untuk menguji aplikasi
  • Dengarkan port 3001 untuk semua perubahan yang masuk

Awalnya, aplikasi kami berfungsi, lalu Anda bisa melakukan database.

Buat tabel data MySQL Anda

Saya sangat berharap bahwa pembaca artikel ini tidak memiliki masalah mengunduh dan menginstal MySQL dan MySQLWorkBranch sendiri. Selanjutnya, Anda sendiri membuat skema (DB) dengan nama yang paling Anda sukai (dalam kasus saya, TODO), lalu pilih permintaan kilat dan salin / ketik perintah berikut:

    CREATE TABLE IF NOT EXISTS `todo` (
        id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        text varchar(255) NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Dalam basis data kami, semuanya akan minimal: hanya id dan teks dari kasing itu sendiri. Namun, untuk menambahkan kolom lain di mana, misalnya, urgensi kasus Anda dapat dijelaskan, saya harap itu tidak akan menimbulkan masalah.

Konfigurasi & Hubungkan dengan basis data kami

Mari kita membangun dan mengkonfigurasi koneksi ke database. Kami akan membuat folder aplikasi baru langsung di folder root kami, dan di sana kami akan membuat file db.config.jsdi folder config, dengan kira-kira konten yang sama, yang tergantung pada pengaturan Anda di MySQLWorkBranch. Dalam kasus saya, file akan terlihat seperti ini:

  module.exports = {
    HOST: "localhost",
    USER: "pavel",
    PASSWORD: "",
    DB: "TODO"
  };

Setelah itu, buat folder untuk menggambarkan model aplikasi / mode kami , di mana kami kemudian akan membuat model:

  const mysql = require("mysql");
  const dbConfig = require("../config/db.config.js");
  
  //      
  const connection = mysql.createConnection({
    host: dbConfig.HOST,
    user: dbConfig.USER,
    password: dbConfig.PASSWORD,
    database: dbConfig.DB
  });
  
  //      
  connection.connect(err => {
    if (err) throw error;
    console.log("    ");
  });

  module.exports = connection;
   //  

Buat Model

Dalam folder tersebut model, kami membuat file bernama deal.model.js. Jika Anda memiliki pertanyaan, apa model secara umum, Anda harus membaca artikel seperti ini dan membiasakan diri dengan pola desain MVC. Saya akan membuat konstruktor untuk objek Deal, dan menggunakan koneksi untuk fungsi CRUD berikut:

  • penciptaan bisnis baru
  • menemukan case oleh id
  • mendapatkan semua kasing
  • kemampuan untuk memperbarui kasus kami dengan id
  • Hapus satu case dengan id
  • penghapusan lengkap semua kasus

Total, kita harus melakukan hal-hal berikut:

  //   
  const Deal = function(deal) {
    this.text = deal.text;
  };
  //    ,        CRUD,      :
  Deal.create = (newDeal, result) => {
    sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
      //   SQL
      if (err) {
        console.log("error: ", err);
        result(err, null);
        //   ,     
        return;
      }
  
      console.log(" ", { id: res.insertId, ...newDeal });
      result(null, { id: res.insertId, ...newDeal });
    });
  };


Saya akan meletakkan sisa kode di spoiler, karena saya tidak melihat alasan untuk membawa semuanya, karena sebenarnya pola kode diulang di sana, hanya perintah dan argumen sql yang berubah:

sisa kode
Deal.findById = (dealId, result) => {
sql.query(`SELECT * FROM TODO WHERE id = ${dealId}`, (err, res) => {
if (err) {
console.log(«error: », err);
result(err, null);
return;
}

if (res.length) {
console.log(« : », res[0]);
result(null, res[0]);
return;
}

//
result({ kind: «not_found» }, null);
});
};

Deal.getAll = result => {
sql.query(«SELECT * FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(«deals: », res);
result(null, res);
});
};

Deal.updateById = (id, deal, result) => {
sql.query(
«UPDATE TODO SET text =? WHERE id = ?»,
[deal.text, id],
(err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
result({ kind: «not_found» }, null);
return;
}

console.log(« », { id: id, ...deal });
result(null, { id: id, ...deal });
}
);
};

Deal.remove = (id, result) => {
sql.query(«DELETE FROM TODO WHERE id = ?», id, (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
// id
result({ kind: «not_found» }, null);
return;
}
console.log(« », id);
result(null, res);
});
};

Deal.removeAll = result => {
sql.query(«DELETE FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(`deleted ${res.affectedRows} deals`);
result(null, res);
});
};



Itu saja untuk saat ini. Bagian selanjutnya dari artikel ini sedang mendekati, di mana kita selesai menulis kembali dan mulai mengujinya. Dan menurut tradisi, beberapa tautan bermanfaat:


All Articles