Cách tạo API NodeJS mà không cần sử dụng khung

Cách tạo API NodeJS mà không cần sử dụng khung

Node.js là một trình chạy JavaScript mã nguồn mở được xây dựng trên công cụ v8 của chrome cho phép bạn chạy mã JavaScript bên ngoài trình duyệt.





Mô hình sự kiện, hệ sinh thái và tốc độ của nó đã làm cho Node.js trở thành một trong những thời gian chạy được mong muốn và sử dụng nhiều nhất cho các ứng dụng phía máy chủ.





Hầu hết các máy chủ API Node.js sử dụng Express hoặc một khuôn khổ khác. Tuy nhiên, bạn cũng có thể tạo một Node.js API đơn giản mà không cần khuôn khổ chỉ trong một vài bước.





LÀM VIDEO TRONG NGÀY

Bước 1: Thiết lập môi trường phát triển của bạn

Tạo một thư mục dự án và đĩa CD vào nó bằng cách chạy:

mkdir nodejs-api 
cd nodejs-api

Tiếp theo, khởi tạo npm trong dự án của bạn bằng cách chạy:



npm init -y 

API CRUD này sẽ có tính năng sử dụng MongoDB, cơ sở dữ liệu NoSQL và ODM, mongoose phổ biến của nó.

Chạy lệnh sau để cài đặt cầy mangut :





npm install mongoose 

Tiếp theo, tạo một server.js tệp trong thư mục gốc của dự án của bạn và thêm khối mã bên dưới để tạo máy chủ:

const http = require("http"); 
const server = http.createServer((req, res) => {});

server.listen(3000, () => {
console.log(`Server is running`);
});

Khối mã này nhập mô-đun http, một mô-đun Node.js cốt lõi. Mô-đun http cho phép Node.js truyền dữ liệu qua HTTP. Mô-đun này chứa các phương thức cần thiết để tạo một máy chủ.





Tiếp theo, nó gọi mô-đun http là createServer phương thức tạo và trả về một phiên bản của máy chủ. Các createServer phương thức nhận một hàm gọi lại với một đối tượng yêu cầu và phản hồi làm tham số.

Tiếp theo, mã gọi nghe trên phiên bản máy chủ được trả về. Điều này cho phép máy chủ bắt đầu lắng nghe lưu lượng truy cập trên cổng nhất định. Các nghe phương thức kích hoạt một cuộc gọi lại — đối số thứ hai — khi nó thành công.

Cuối cùng, tạo hai thư mục có tên các tuyến đường người mẫu trong thư mục gốc của dự án của bạn. Các các tuyến đường thư mục sẽ chứa logic định tuyến cho API của bạn, trong khi người mẫu sẽ chứa mọi thứ liên quan đến cơ sở dữ liệu.

Bước 2: Kết nối ứng dụng của bạn với cơ sở dữ liệu

Trong server.js , nhập khẩu cầy mangut :

ẩn một thư mục trong windows 10
const mongoose = require("mongoose"); 

Gọi liên kết phương pháp trên cầy mangut và chuyển URI MongoDB của bạn làm đối số:

mongoose.connect("MongoDB_URI") 

Bước 3: Tạo mô hình API

Tạo một API CRUD cho một ứng dụng blog đơn giản. Trong của bạn người mẫu thư mục, tạo một blogModel.js và thêm mã sau vào tệp của bạn:

const mongoose = require("mongoose"); 
const blogSchema = mongoose.Schema({
title: {
type: String,
required: [true, "Blog must have a title"],
},
body: {
type: String,
required: [true, "Blog must have a body"],
},
});
module.exports = mongoose.model("Blog", blogSchema);

Khối mã ở trên tạo một mô hình mongoose với hai thuộc tính và ánh xạ chúng tới cơ sở dữ liệu MongoDB.

Cả hai thuộc tính trong mô hình này đều có Sợi dây gõ với yêu cầu đặt thành thật . Các thông báo lỗi kèm theo sẽ hiển thị nếu nội dung yêu cầu không chứa một trong các thuộc tính.

Dòng cuối cùng tạo và xuất mô hình mongoose bằng cách gọi người mẫu phương pháp trên cầy mangut. Chuyển tên mô hình ( Blog ) dưới dạng đối số đầu tiên và một lược đồ ( blogSchedule ) như đối số thứ hai.

Bước 4: Triển khai định tuyến trong ứng dụng của bạn

Nếu không có sự hỗ trợ của các khuôn khổ như Express , bạn sẽ phải tạo logic theo cách thủ công để xử lý từng yêu cầu được gửi đến API của bạn.

Đầu tiên, hãy tạo một blogRoutes.js nộp hồ sơ của bạn các tuyến đường thư mục, sau đó nhập mô hình blog:

const Blog = require("../models/blogModel"); 

Tiếp theo, tạo không đồng bộ bộ định tuyến chức năng, vượt qua yêu cầu res dưới dạng tham số và xuất hàm:

const router = async function (req, res) {}; 
module.exports = router;

Hàm này sẽ chứa tất cả logic định tuyến của bạn.

Tiếp theo, bạn sẽ triển khai lộ trình logic định tuyến theo tuyến.

Nhận các tuyến đường

Thêm khối mã bên dưới vào bộ định tuyến chức năng để thực hiện LẤY trình xử lý tuyến đường cho các yêu cầu được thực hiện tới / api / blog :

//  GET: /api/blogs 
if (req.url === "/api/blogs" && req.method === "GET") {
// get all blogs
const blogs = await Blog.find();

// set the status code and content-type
res.writeHead(200, { "Content-Type": "application/json" });

// send data
res.end(JSON.stringify(blogs));
}

Khối mã ở trên kiểm tra url phương pháp thuộc tính của đối tượng yêu cầu. Sau đó, nó tìm nạp tất cả các blog từ cơ sở dữ liệu thông qua tìm thấy phương thức trên mô hình mongoose ( Blog ).

Tiếp theo, nó gọi writeHead phương pháp trên res , đối tượng phản hồi. Phương thức này gửi một tiêu đề phản hồi với ba đối số: mã trạng thái, thông báo trạng thái tùy chọn và tiêu đề. Các 200 mã trạng thái đại diện cho một phản hồi thành công và loại nội dung cho lệnh gọi API này được đặt thành ứng dụng / json .

Cuối cùng, đóng yêu cầu để đảm bảo máy chủ không bị treo bằng cách gọi chấm dứt phương pháp trên res . Cuộc gọi đến JSON.stringify chuyển đổi blog đối tượng với một chuỗi JSON và chuyển nó tới chấm dứt phương thức trả về nó dưới dạng phần thân phản hồi.

Thêm khối mã bên dưới vào bộ định tuyến chức năng để thực hiện LẤY trình xử lý tuyến đường cho một tài nguyên:

// GET: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "GET") {
try {
// extract id from url
const id = req.url.split("/")[3];

// get blog from DB
const blog = await Blog.findById(id);

if (blog) {
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(blog));
} else {
throw new Error("Blog does not exist");
}
} catch (error) {
res.writeHead(404, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: error }));
}
}

Mã này sử dụng cuộc thi đấu phương thức lấy biểu thức regex làm đối số để kiểm tra xem url có khớp với định dạng không: / api / blog / .

Tiếp theo, giải nén Tôi tài sản từ url chuỗi bằng cách gọi nó tách ra phương pháp. Phương thức này nhận một mẫu làm đối số ( / ), tách chuỗi dựa trên mẫu và trả về một mảng. Phần tử thứ ba của mảng đó là Tôi .

Cuối cùng, truy xuất tài liệu có khớp Tôi từ cơ sở dữ liệu của bạn. Nếu nó tồn tại, hãy gửi một mã phản hồi 200 , đóng yêu cầu và gửi blog đã truy xuất. Nếu nó không tồn tại, hãy ném một lỗi và gửi nó dưới dạng phản hồi trong khối bắt.

ĐĂNG lộ trình

Thêm khối mã bên dưới vào chức năng bộ định tuyến của bạn để triển khai BƯU KIỆN trình xử lý tuyến đường:

// POST: /api/blogs/ 
if (req.url === "/api/blogs" && req.method === "POST") {
try {
let body = "";

// Listen for data event
req.on("data", (chunk) => {
body += chunk.toString();
});

// Listen for end event
req.on("end", async () => {
// Create Blog
let blog = new Blog(JSON.parse(body));

// Save to DB
await blog.save();
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(blog));
});
} catch (error) {
console.log(error);
}
}

Đối tượng yêu cầu thực hiện Node.js ReadableStream giao diện. Luồng này phát ra một dữ liệu và một chấm dứt sự kiện cung cấp cho bạn quyền truy cập vào dữ liệu từ phần thân yêu cầu.

Mã này lắng nghe sự kiện dữ liệu và xử lý nó bằng cách chuyển đổi nó thành một chuỗi và nối nó với thân hình Biến đổi. bên trong chấm dứt xử lý sự kiện, nó tạo ra một Blog ví dụ với chuỗi nội dung đã được phân tích cú pháp. Sau đó, nó lưu blog mới, gửi mã trạng thái và tiêu đề nội dung, và đóng yêu cầu.

Tuyến đường PUT

Thêm khối mã bên dưới vào chức năng bộ định tuyến của bạn để triển khai ĐẶT trình xử lý tuyến đường:

// PUT: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "PUT") {
try {
// extract id from url
const id = req.url.split("/")[3];
let body = "";

req.on("data", (chunk) => {
body += chunk.toString();
});
req.on("end", async () => {
// Find and update document
let updatedBlog = await Blog.findByIdAndUpdate(id, JSON.parse(body), {
new: true,
});

res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(updatedBlog));
});
} catch (error) {
console.log(error);
}
}

Trình xử lý yêu cầu PUT gần giống với BƯU KIỆN trình xử lý yêu cầu, ngoại trừ việc nó trích xuất Tôi tài sản từ url để cập nhật blog có liên quan.

XÓA tuyến đường

Thêm khối mã bên dưới vào chức năng bộ định tuyến của bạn để triển khai XÓA BỎ trình xử lý tuyến đường:

// DELETE: /api/blogs/:id 
if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === "DELETE") {
try {
const id = req.url.split("/")[3];

// Delete blog from DB
await Blog.findByIdAndDelete(id);
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: "Blog deleted successfully" }));
} catch (error) {
res.writeHead(404, { "Content-Type": "application/json" });
res.end(JSON.stringify({ message: error }));
}
}

Khối mã này trích xuất Tôi từ url , xóa tài liệu có khớp Tôi , gửi mã trạng thái và tiêu đề, đồng thời đóng yêu cầu.

Cuối cùng, nhập bộ định tuyến trong của bạn server.js nộp hồ sơ và gọi cho bạn bộ định tuyến chức năng, đi qua yêu cầu res như các đối số:

const router = require("./routes/blogRoutes"); 

const server = http.createServer((req, res) => {
router(req, res);
});

Điều này cho phép máy chủ của bạn chặn và xử lý các yêu cầu một cách thích hợp.

Bạn có thể tìm thấy dự án đã hoàn thành trong này Kho lưu trữ GitHub .

Sử dụng Khung Node.js

Mặc dù có thể tạo web API bằng tay, nó có thể là một nhiệm vụ khó khăn. Bạn sẽ cần đảm bảo rằng bạn đã bao gồm rất nhiều trường hợp phức tạp và mã của bạn tốt hơn là không có lỗi.

Trong nhiều năm, các nhà phát triển đã xây dựng các framework như ExpressJS, NestJS, Fastify, v.v., để làm cho nó dễ dàng hơn nhiều.