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: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.json
Anda 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 .gitignore
agar 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();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
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.body
yang 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.js
di 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;
};
Deal.create = (newDeal, result) => {
sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
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 kodeDeal.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: