Võ Duy Tạo Lorem ipsum Trang 2 MỤC LỤC Lời nói đầu 5 Cách học đúng cách 5 Yêu cầu trình độ 6 Liên hệ với tác giả 6 Phần 1 Giới thiệu 7 Giới thiệu ứng dụng blog sẽ xây dựng 7 Node js là gì? 8 Cài đặt N.
Giới thiệu
Node.js is a JavaScript runtime that enables the execution of JavaScript on the server side Many prominent companies, including Walmart, LinkedIn, PayPal, YouTube, and Yahoo!, have adopted Node.js to develop their applications.
Amazon.com, Netflix, eBay và Reddit
Trong cuốn sách này, bạn sẽ khám phá cách xây dựng một blog từ đầu bằng Node.js, Express và MongoDB Qua quá trình đọc và thực hành, bạn sẽ nắm vững các kỹ thuật cần thiết để tự phát triển ứng dụng của riêng mình.
Chúng ta sẽ khám phá một loạt kỹ thuật quan trọng như xác thực người dùng, xác thực dữ liệu, xử lý bất đồng bộ trong JavaScript, sử dụng Express, MongoDB và các template engine.
Giới thiệu ứng dụng blog sẽ xây dựng
Để việc học lập trình hiệu quả, chúng ta sẽ xây dựng một ứng dụng hoàn chỉnh thay vì chỉ học những đoạn code mẫu ngắn và không liên quan Tiêu chí của chúng ta là "học đến đâu, ứng dụng đến đó" Dưới đây là giao diện của ứng dụng.
Hình 1.1: Template giao diện dùng trong sách
Người dùng có thể dễ dàng đăng ký tài khoản mới trên trang blog này Sau khi hoàn tất đăng ký, họ có thể truy cập trang chủ và đăng nhập vào blog Thanh điều hướng sẽ hiển thị các menu khác nhau dựa trên trạng thái đăng nhập của người dùng Để thiết kế giao diện, chúng ta sẽ sử dụng EJS template engine.
Sau khi người dùng đăng nhập, thanh điều hướng sẽ hiển thị tùy chọn "Đăng Xuất" để họ có thể dễ dàng thoát khỏi tài khoản Bên cạnh đó, menu "Bài Viết Mới" cho phép người dùng tạo bài viết mới và tải ảnh lên blog Sau khi hoàn tất việc tạo bài viết, người dùng có thể quay lại trang chủ, nơi blog sẽ hiển thị danh sách các bài viết đã được xuất bản.
Thông qua việc thực hành xây dựng ứng dụng blog này, bạn sẽ nắm chắc được kiến thức về Node.js, kết hợp với express và MongoDB
Trước khi tìm hiểu về Node.js, cần nắm rõ cách hoạt động của Internet Khi người dùng mở trình duyệt và truy cập vào một website như vntalking.com, họ tạo ra một yêu cầu (request) tới server Lúc này, người dùng và trình duyệt được xem là client Server sẽ phản hồi lại yêu cầu của client bằng nội dung của trang web mà họ đã yêu cầu.
Nhiều ngôn ngữ lập trình như PHP, Ruby, Python, ASP và Java được phát triển để xây dựng ứng dụng cho server Trước đây, Javascript chủ yếu được thiết kế để hoạt động trên trình duyệt, nhằm tăng cường tính tương tác của trang web với người dùng, chẳng hạn như các menu có hiệu ứng dropdown và hiệu ứng tuyết rơi.
Năm 2009 đánh dấu sự ra đời của Node.js, sử dụng V8 engine để chạy mã Javascript, giúp Javascript vượt ra khỏi trình duyệt và có thể chạy trên server Điều này đã biến Javascript thành một lựa chọn hấp dẫn bên cạnh các ngôn ngữ server truyền thống như PHP, Golang và JAVA.
Những lợi ích mà Node.js mang lại cho bạn:
V8 JavaScript engine là một công cụ mạnh mẽ, được tích hợp trong trình duyệt Chrome của Google, giúp tăng tốc độ hoạt động của ứng dụng của bạn một cách đáng kể.
Node.js khuyến khích lập trình bất đồng bộ để nâng cao hiệu suất ứng dụng và giảm thiểu các vấn đề liên quan đến đa luồng.
Thứ 3 đó là Javascript là một ngôn ngữ rất phổ biến, do vậy bạn sẽ thừa hưởng rất nhiều thư viện hay ho mà lại miễn phí
Cuối cùng, Node.js sử dụng JavaScript, giúp bạn tận dụng kiến thức hiện có khi phát triển ứng dụng trên trình duyệt Giờ đây, bạn chỉ cần thành thạo JavaScript để trở thành lập trình viên full stack, mà không cần học thêm ngôn ngữ mới.
Để cài đặt Node.js, bạn hãy truy cập trang chủ nodejs.org và tải phiên bản phù hợp với hệ điều hành của máy tính bạn.
Cài đặt phần mềm trên máy tính Windows rất đơn giản, tương tự như các ứng dụng khác Để biết thêm thông tin chi tiết về quy trình cài đặt, bạn có thể tham khảo tại đây.
Sau khi cài xong, bạn có thể kiểm tra version bằng lệnh sau: node -v
Ngoài ra, khi cài đặt Node.js, bạn sẽ được khuyến mãi cả NPM nữa npm -v
Kết quả hiện ra như hình 1.3 là được
Hình 1.3: kiểm tra phiên bản node.js
Tạo server Nodejs đầu tiên
Chúng ta sẽ xây dựng một server đơn giản bằng Node.js để giúp bạn hiểu rõ cách mà một client gửi yêu cầu đến server và cách mà server xử lý và phản hồi lại yêu cầu đó.
Giới thiệu về NPM và Express
NPM (Node Package Manager) và Express là hai công cụ quan trọng trong phát triển ứng dụng Node.js Trong đoạn code minh họa của phần 1, chúng ta đã sử dụng các package tích hợp sẵn của Node.js như http và fs Tuy nhiên, còn rất nhiều package do các nhà phát triển bên thứ ba cung cấp, có thể được sử dụng để nâng cao dự án của bạn Tất cả những package này được lưu trữ trên trang web npmjs.com, nơi được xem như một thị trường cho các package, cho phép bạn dễ dàng lựa chọn và tích hợp những package phù hợp với nhu cầu của dự án.
Còn NPM (Node Package Manager) là phần mềm được cài đặt cùng với Node.js, nó được dùng để quản lý các packages mà bạn download từ npmjs.com
Hình 2.1: giao diện trang web npmjs.com
Để cài đặt một gói (package) từ npmjs.com, bạn cần tìm kiếm gói đó qua hộp tìm kiếm Sau khi chọn được gói phù hợp, hãy xem xét các thông tin chi tiết của gói như trong hình minh họa bên dưới.
Hình 2.2: Trang thông tin một module trên npmjs.com Ở đây nhìn vào thông tin cách cài đặt, họ có ghi rõ lệnh cài đặt package này bằng npm:
Ví dụ lệnh cài đặt package easy-password-gen như hình 2.2 npm i easy-password-gen
Trong bài viết này, mình sẽ giới thiệu về ExpressJS, một package quan trọng và phổ biến trong Node.js Do cú pháp API của Node.js thường dài dòng và khó hiểu, nhiều lập trình viên đã tìm kiếm một framework để đơn giản hóa quá trình phát triển ứng dụng.
ExpressJS là một framework nhỏ nhưng linh hoạt, được xây dựng trên nền tảng Node.js, cung cấp các tính năng mạnh mẽ cho việc phát triển ứng dụng web Nó giúp đơn giản hóa các API của Node.js, tổ chức dự án theo mô hình MVC với middleware và routing Ngoài ra, ExpressJS còn cung cấp nhiều hàm Utils hữu ích để xử lý HTTP và render HTML Để cài đặt ExpressJS, bạn chỉ cần gõ: npm install express.
Trước khi cài đặt express, bạn cần tạo file package.json cho dự án, vì đây là file cấu hình lưu trữ thông tin quan trọng như tên dự án, phiên bản và các gói (packages) sử dụng Nếu bạn cố gắng chạy lệnh npm install express mà không có package.json, bạn sẽ gặp lỗi "no such file or directory, open … package.json".
Trang 17 Để generate ra file package.json, bạn di chuyển con trỏ vào thư mục dự án, gõ lệnh: npm init
Sau đó bạn điền các thông tin như trong hướng dẫn của trình thuật sĩ Sau khi hoàn thành, bạn gõ "Yes" để xác nhận tạo package.json
Ví dụ đây là package.json mà mình tạo cho dự án cho phần 2 của cuốn sách này
"description": "Code minh họa cho chap 2",
"test": "echo \"Error: no test specified\" && exit 1"
To install Express, simply enter the command: npm install express Once the installation is complete, you will notice that the package.json file has been updated to include Express as a dependency.
"description": "Code minh họa cho chap 2",
"test": "echo \"Error: no test specified\" && exit 1"
The dependencies section includes all package names along with their installed versions As of this book's publication, the latest version of Express is 4.17.1 Additionally, the entire source code for the Express package is stored in the node_modules directory.
Hình 2.3: nơi chứa mã nguồn expressJS trong dự án
Khi mở thư mục node_modules, bạn sẽ thấy không chỉ có thư mục express mà còn nhiều thư mục khác, mặc dù bạn chỉ cài đặt ExpressJS Điều này xảy ra vì ExpressJS phụ thuộc vào nhiều dependencies khác, do đó khi cài đặt, các thư mục này cũng được tự động cài theo.
ExpressJS thì npm cũng sẽ tải và cài đặt chúng luôn Để biết được express có những dependencies nào thì bạn lại vào package của ExpressJS là sẽ thấy
Bạn không nên chỉnh sửa bất kỳ dòng code nào trong thư mục node_modules, vì đây là mã nguồn gốc của package Việc sửa đổi có thể gây ra lỗi mà bạn không thể lường trước được.
ExpressJS là một framework mạnh mẽ giúp phát triển ứng dụng Node.js một cách đơn giản và nhanh chóng Để bắt đầu sử dụng Express, bạn cần import nó vào ứng dụng của mình bằng cách thêm đoạn mã sau vào file index.js.
To demonstrate why ExpressJS accelerates application development, we will rewrite the concepts from the first part of the book using ExpressJS By utilizing ExpressJS, we can simplify the server creation process, as shown in the code snippet where we create an HTTP server that logs a greeting message to the console This highlights ExpressJS's efficiency in handling requests and responses, making it a powerful tool for developers.
Nhưng với ExpressJS thì bạn chỉ cần như sau: const express = require('express') const app = express() app.listen(3000, () =>{ console.log("App listening on port 3000")
ExpressJS giúp đơn giản hóa quá trình phát triển ứng dụng web bằng cách tự động quản lý việc import các package cần thiết mà không cần lập trình viên phải can thiệp Điều này không chỉ rút gọn mã nguồn mà còn mang lại nhiều tiện ích hơn cho người dùng Tuy nhiên, giá trị của ExpressJS không chỉ dừng lại ở việc giảm thiểu code, mà còn ở khả năng mở rộng và tính linh hoạt của nó trong việc xử lý các yêu cầu và phản hồi.
Xử lý request với Express
ExpressJS cung cấp khả năng xử lý linh hoạt cho các yêu cầu "GET" và "POST" từ trình duyệt Dưới đây là ví dụ về cách ứng dụng trả về một đối tượng JSON khi nhận được yêu cầu: const express = require('express'); const app = express(); app.listen(3000, () => { console.log("App đang lắng nghe trên cổng 3000"); });
}) app.get("/", (request, response) =>{ response.json({ name: "Duong Anh Son", website: "VNTALKING.COM"
ExpressJS cung cấp nhiều tùy chọn để phản hồi các yêu cầu từ trình duyệt, chẳng hạn như sử dụng hàm response.json() để trả về đối tượng JSON Điều này giúp việc xây dựng các REST API với Node.js trở nên dễ dàng hơn.
Ngoài ra, chúng ta có thể địng nghĩa những routes cụ thể, ví dụ như: app.get("/about", (request, response) =>{ response.json({ name: "Duong Anh Son", website: "VNTALKING.COM"
Routing refers to the process of defining how a server responds to specific URLs In the first part of the article, we see that handling distinct URLs requires the use of if-else statements within a larger request processing function For example, a server can be created using `http.createServer` to respond with different messages based on the requested URL, such as returning 'The about page' for '/about', 'The contact page' for '/contact', and 'The home page' for the root URL '/' If a URL does not match any predefined routes, the server will respond with a 404 error, indicating that the page was not found.
Với ExpressJS thì bạn có thể tách riêng biệt cho từng URL riêng biệt Điều này giúp tăng khả năng module hóa hay khả năng bảo trì dự án
Với đoạn code thì express có thể tách như sau: app.get("/about", (request, response) =>{ res.send('The about page')
}) app.get("/contact", (req, res) =>{ res.send('The contact page')
}) app.get("/contact", (req, res) =>{
Trang 21 res.send('The contact page')
}) app.get("/", (req, res) =>{ res.send('The home page')
}) app.get('*', function(req, res){ res.header(404) res.send('page not found')
Bất đồng bộ với Call Back
Bước đầu tạo web app với Express
Bước đầu tiên trong việc tạo web app với Express là không tập trung vào việc thiết kế website bằng HTML và CSS Thay vào đó, chúng ta sẽ sử dụng một template có sẵn để thực hành Node.js và ExpressJS Để tìm kiếm template phù hợp, bạn có thể truy cập trang startbootstrap.com và lựa chọn một mẫu mà bạn ưng ý nhất.
Trong cuốn sách này, mình chọn clean blog template - Hình 3.1
(https://startbootstrap.com/themes/clean-blog/)
Hình 3.1 Giao diện một web template
Bạn tải miễn phí template này về, và giải nén vào một thư mục trong máy tính
Bước tiếp theo, chúng ta sẽ khởi tạo dự án Node.js mới bằng câu lệnh: npm init
(Bạn cứ trả lời "Yes" cho các câu hỏi mà NPM hỏi để tạo ra package.json) Tiếp theo thì mình cài đặt express cho dự án
To create a simple server in your project, first, create an `index.js` file in the root directory Then, use the following code: ```javascriptconst express = require('express');const app = new express();app.listen(4000, () => { console.log('App listening on port 4000');});```This code initializes an Express application and sets it to listen on port 4000, displaying a message in the console when the server is running.
}) Để chạy server, bạn gõ lệnh sau vào terminal:
Tự động khởi động server mỗi khi thay đổi mã nguồn
Để kiểm tra kết quả sau khi thay đổi mã nguồn mà không cần phải dừng và khởi động lại server, bạn có thể thiết lập tự động khởi động lại server mỗi khi có thay đổi trong mã nguồn Để thực hiện điều này, cần cài đặt thêm thư viện theo dõi mã nguồn.
Có nhiều thư viện làm điều như: forever, nodemon
Trong cuốn sách này, chúng ta sẽ sử dụng nodemon Để cài đặt nodemon cho dự án, từ terminal:
$ npm install nodemon save-dev Để mình giải thích qua một chút về các tham số trong câu lệnh trên:
Tham số save được sử dụng để thêm thông tin vào mục dependencies trong file package.json sau khi cài đặt thư viện vào thư mục node_modules Việc này giúp cho những người khác có thể dễ dàng cài đặt các thư viện cần thiết cho dự án chỉ bằng lệnh npm install, tự động cài đặt tất cả dependencies được liệt kê trong package.json.
Trong quá trình phát triển dự án, có những thư viện chỉ cần thiết cho việc hỗ trợ mà không cần thiết khi triển khai ra thị trường Vì vậy, trong file package.json, phần dependencies được chia thành hai loại: "dependencies" và "devDependencies".
Tham số -dev là để thêm vào "devDependencies"
Npm start Ở phần trên của cuốn sách, mình có hướng dẫn các bạn khởi động server bằng lệnh: node
Để đơn giản hóa việc khởi động server và dễ nhớ cho những lần thực hiện sau, bạn có thể sử dụng lệnh ngắn gọn là: npm start, thay vì phải tùy biến lệnh khởi động phức tạp.
Các bạn mở package.json, rồi tìm đến thẻ scripts và sửa như sau:
Từ giờ, mỗi lần khởi động server, bạn chỉ cần gõ lệnh:
Với phương pháp này, bạn sẽ không cần phải lo lắng về việc xác định file chính của dự án, như index.js hay app.js, mà chỉ cần gõ lệnh npm start để khởi động dự án một cách dễ dàng.
Tạo thư mục public chứa tệp static
Các tệp static là những tệp tạo giao diện và tương tác trực tiếp với người dùng mà không cần qua router, bao gồm ảnh, CSS, HTML và JavaScript.
Trong phần trước của cuốn sách, chúng ta đã thảo luận về lý thuyết, và bây giờ hãy bắt đầu thực hành bằng cách tạo các tệp static cho blog dự án của chúng ta Để làm điều này, chúng ta sẽ sử dụng mã lệnh sau: `const express = require('express')` và `const app = new express()`.
//Đăng ký thư mục public app.use(express.static('public')) app.listen(4000, () => { console.log('App listening on port 4000')
Vì chúng ta đang sử dụng template có sẵn, các tệp HTML đã được chuẩn bị trước, do đó không cần tạo mới Bạn chỉ cần di chuyển các tệp HTML như index.html, about.html, contact.html và post.html vào thư mục public.
Tiếp theo, chúng ta sẽ chuyển tất cả những thư mục css, img, js, vendor vào trong thư mục public
OK, giờ bạn sẽ thấy cấu trúc thư mục dự án mới sẽ như này
Hình 3.2: thư mục public trong dự án
Bạn thử mở một tệp html lên xem mã nguồn, bạn sẽ biết tạo chúng ta lại chuyển những thư mục css, js vào thư mục public
Ví dụ, với tệp index.html, bạn có thấy các thẻ link tới thư mục vendor, css (mình có bôi đậm trong code đó)
Clean Blog - Start Bootstrap Theme
Khi sử dụng các kiểu tương đối như css/clean-blog.min.css, trình duyệt sẽ tự động kết hợp với tên miền để tạo thành liên kết hoàn chỉnh: http:///css/clean-blog.min.css Để bắt đầu, bạn chỉ cần chạy server bằng lệnh: $ npm start.
Sau đó vào trình duyệt kiểm tra: http://localhost:4000
Hình 3.3: Kiểm tra link static resource trên trình duyệt
Khi bạn nhấp vào các liên kết trên giao diện như: Giới thiệu, Bài viết tương tự, Liên hệ, trang web sẽ chuyển đến đúng trang đích Tuy nhiên, hiện tại, trang web của chúng ta chỉ là một trang tĩnh với các file HTML liên kết mà chưa được xử lý.
Việc tiếp theo, chúng ta sẽ xử lý việc chuyển trang (about, sample post, contact) thông qua route
Hiện tại, chúng ta chỉ phản hồi một tệp HTML từ thư mục public, nhưng nhược điểm là thư mục này có thể bị truy cập bởi bất kỳ ai Server chỉ trả về tệp yêu cầu mà không thể xử lý logic nào khác Để thực hiện các thao tác như xác thực request, chúng ta cần sử dụng routes Để thực hành, hãy tạo một thư mục mới tên là pages và sao chép tệp index.html vào đó.
Sau đó, chúng ta mở tệp index.js và tạo route như sau: const express = require('express') const app = new express() const path = require('path')
app.get('/', (request, response) =>{ response.sendFile(path.resolve( dirname, 'pages/index.html'))
Giờ cứ có một request tới trang chủ "/", thì trang index.html sẽ được trả về
Trong phần 3 của cuốn sách, chúng ta đã học cách tạo một trang web từ template có sẵn và sử dụng nodemon để tự động phát hiện sự thay đổi trong mã nguồn, giúp khởi động lại node server một cách hiệu quả Cuối cùng, bạn đã nắm vững cách tạo route để ứng dụng có thể chuyển đổi giữa các trang.
Các bạn có thể tìm hiểu mã nguồn cho phần này tại [đây](https://github.com/vntalking/nodejs-express-mongodb-co-ban/tree/master/chap3) Nếu có bất kỳ câu hỏi nào hoặc cần làm rõ điều gì, hãy liên hệ với tôi qua email: support@vntalking.com.
Templating Engine
Template engine là công cụ giúp bạn tạo ra các trang HTML linh hoạt hơn bằng cách cho phép thêm logic xử lý trước khi xuất ra HTML Một trong những lợi ích quan trọng của việc sử dụng template engine là khả năng tái sử dụng đoạn mã, đặc biệt cho những phần xuất hiện nhiều lần trên các màn hình khác nhau, điều mà các tệp HTML thuần khó thực hiện.
Trong số nhiều template engine hiện có như Pug, Handlebars, Jade và EJS, mình sẽ chọn EJS cho cuốn sách này EJS là một template engine phổ biến, được nhiều lập trình viên ưa chuộng, đặc biệt khi kết hợp với Express.
EJS là một ngôn ngữ templating giúp tạo ra HTML bằng cách sử dụng JavaScript thuần Để bắt đầu sử dụng EJS trong dự án của bạn, trước tiên cần cài đặt EJS và sử dụng cặp tag .
$ npm install ejs save Để sử dụng EJS trong dự án, bạn cần khai báo nó với Express const express = require('express') const app = new express()
const ejs = require('ejs') app.set('view engine','ejs')
Thông qua câu lệnh `app.set('view engine', 'ejs')`, chúng ta thông báo cho ExpressJS rằng EJS sẽ là template engine được sử dụng, và các file có đuôi ejs sẽ được render bằng gói EJS Như đã đề cập ở phần trước, chúng ta đã tạo route để xử lý và phản hồi cho client.
Trang 32 app.get('/', (request, response) =>{ response.sendFile(path.resolve( dirname, 'pages/index.html'))})
Giờ với EJS thì chúng ta chuyển thành như sau: app.get('/', (request, response) =>{ response.render('index')
Với đoạn mã trên, ExpressJS sẽ kiểm tra thư mục "views" trong dự án để tìm tệp index.ejs Nếu tệp này tồn tại, hệ thống sẽ sử dụng EJS engine để tạo ra mã HTML.
Remember to change the file extension from html to ejs, as this is the format supported by EJS Apply the same change to the about, contact, and sample post pages For example, use the code app.get('/about', (req, res) => { to define the route for the about page.
//res.sendFile(path.resolve( dirname,'pages/about.html')) res.render('about');
}) app.get('/contact', (req, res) => {
//res.sendFile(path.resolve( dirname,'pages/contact.html')) res.render('contact');
}) app.get('/post', (req, res) => {
//res.sendFile(path.resolve( dirname,'pages/post.html')) res.render('post')
Sau các bạn đổi tên và chuyển vào thư mục views, giờ dự án sẽ trông như thế này (Hình 4.1)
Hình 4.1: thư mục chứa layout của web app
Để khắc phục tình trạng lặp mã khi thiết kế giao diện HTML, việc sử dụng layout file từ template engine là giải pháp hiệu quả Các thành phần như header và footer thường xuất hiện trên nhiều trang, và layout file giúp bạn tái sử dụng mã HTML một cách dễ dàng, giảm thiểu sự phức tạp trong việc quản lý mã nguồn.
Bạn sẽ tạo riêng các file giao diện dùng chung như: header, footer, navbar layout, scripts layout… Sau đó sẽ include chúng vào từng page riêng lẻ
Trong file index.ejs, có nhiều thành phần chung như , , , và xuất hiện trên các màn hình khác nhau Chúng ta sẽ tách riêng những thành phần này thành các file riêng biệt: header.ejs, footer.ejs, scripts.ejs, và navbar.ejs Điều này giúp dễ dàng bao gồm chúng vào các trang khác trong tương lai.
Chúng ta thực hành nhé Đầu tiên, bạn thêm một thư mục layouts trong views
Tiếp theo, bạn copy toàn bộ nội dung code trong thẻ trong tệp index.ejs sang header.ejs
VNTALKING - Clean Blog
Thực hiện tương tự cho các tệp: footer.ejs, scripts.ejs, navbar.ejs
Bạn tham khảo kết quả toàn bộ việc tách file tại đây nhé: https://github.com/vntalking/nodejs-express-mongodb-co- ban/tree/master/chap4/views/layouts
Sau khi tách các tệp common, bạn cần sử dụng lệnh include để thêm chúng vào các trang Ví dụ, để bao gồm tệp header, bạn có thể sử dụng cú pháp: Tệp index.ejs của bạn sẽ được cập nhật với đoạn mã này (lưu ý phần đã bôi đậm).
A Blog Theme by Start Bootstrap
In this section, we have refactored the source code by utilizing a template engine to maximize code reusability As a result, our codebase is now more organized and easier to maintain To dynamically generate HTML using the template engine in Node.js, you can call the function res.render('…').
Các bạn có thể tìm thấy mã nguồn cho phần này tại [đây](https://github.com/vntalking/nodejs-express-mongodb-co-ban/tree/master/chap4) Nếu có bất kỳ câu hỏi nào hoặc cần thêm thông tin, hãy liên hệ với mình qua email: support@vntalking.com.
Giới thiệu MongoDB
MongoDB là một trong những cơ sở dữ liệu NoSQL phổ biến nhất, thường được sử dụng cùng với Node.js Khi lựa chọn giữa SQL và NoSQL, như PostgreSQL cho SQL và MongoDB cho NoSQL, điều quan trọng là phải xem xét yêu cầu cụ thể của dự án và nhu cầu của khách hàng, vì mỗi loại cơ sở dữ liệu đều có những ưu và nhược điểm riêng.
Trong cuốn sách này, mình sẽ sử dụng MongoDB làm hệ quản trị cơ sở dữ liệu cho ứng dụng
MongoDB là một hệ quản trị cơ sở dữ liệu mã nguồn mở, phổ biến trong quản lý dữ liệu kiểu NoSQL, được hàng triệu người dùng tin tưởng Để hiểu rõ hơn về NoSQL, trước tiên chúng ta cần xem xét các loại cơ sở dữ liệu quan hệ, nơi mà dữ liệu được tổ chức thành các bảng, như trong MySQL hay SQL Server.
NoSQL là một loại cơ sở dữ liệu mã nguồn mở, viết tắt của None-Relational SQL hoặc Not-Only SQL Nó ra đời nhằm khắc phục những hạn chế của hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) về tốc độ, tính năng và khả năng mở rộng NoSQL không chú trọng vào tính toàn vẹn dữ liệu và giao dịch, mà tập trung vào hiệu suất nhanh và khả năng mở rộng linh hoạt.
Có nhiều phần mềm quản trị cơ sở dữ liệu dạng NoSQL như MongoDB, Azure Cosmos
DB, Cloud Bigtable (Google), Cassandra …
Nhưng tại sao lại chọn MongoDB?
Thứ nhất là MongoDB rất phổ biển, điều đó có nghĩa là khi bạn có vấn đề thì với cộng đồng đông đảo sẵn sàng giúp đỡ bạn
MongoDB là một trong những hệ quản trị cơ sở dữ liệu NoSQL đầu tiên, được nhiều công ty lớn như eBay, Craigslist và Orange tin dùng, cho thấy sự tin cậy và hiệu quả của giải pháp mà MongoDB cung cấp.
Như mình đã nói ở trên, kiến trúc của MongoDB là NoSQL, thông tin được lưu trữ trong document kiểu JSON thay vì dạng bảng như CSDL quan hệ
Trong MongoDB, chúng ta có khái niệm Collection, một collection sẽ tương ứng với khái niệm table trong CSDL quan hệ
Collection sẽ chứa documents Mỗi một document sẽ tương ứng với một record, được biểu diễn dưới dạng JSON
Một sản phẩm như sách sẽ bao gồm các thông tin cơ bản như tên sách, ảnh bìa và giá Mỗi thông tin này được thể hiện dưới dạng cặp key-value Dưới đây là ví dụ minh họa cho cách lưu trữ thông tin của một cuốn sách trong MongoDB.
{ price: 100000, name: "Lập trình Node.js thật là đơn giản", image: "https://vntalking.com/lap_trinh_nodejs.png"
Có nhiều phương pháp để cài đặt MongoDB, và bạn có thể dễ dàng tìm kiếm trên Google với từ khóa “cài đặt MongoDB” để nhận được nhiều hướng dẫn khác nhau Bạn hoàn toàn có thể lựa chọn phương pháp mà mình cảm thấy phù hợp nhất.
MongoDB hỗ trợ đa nền tảng nên tùy vào máy tính của bạn sử dụng HĐH nào mà chọn phiên bản MongoDB tương ứng
Khi bạn vào trang chủ MongoDB, bạn sẽ được họ gợi ý sử dụng dịch vụ
MongoDB – Cloud cho phép bạn sử dụng dịch vụ mà không cần cài đặt trên máy tính Tuy nhiên, việc làm quen với việc chạy MongoDB trên máy chủ riêng là rất quan trọng, giúp bạn có khả năng tự triển khai và không phụ thuộc vào dịch vụ của họ trong tương lai.
Trong cuốn sách này mình sẽ hướng dẫn các bạn cài đặt MongoDB trên máy tính
Cài đặt MongoDB Community Edition trên Ubuntu rất đơn giản Để bắt đầu, bạn cần truy cập tài liệu hướng dẫn cài đặt chính thức của MongoDB tại [đây](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/) Hướng dẫn này sẽ giúp bạn cài đặt MongoDB 8.0 trên các phiên bản Ubuntu LTS bằng cách sử dụng trình quản lý gói `apt`.
Bước 1: Import “MongoDB public GPG Key” sử dụng command apt-key sudo apt-key adv keyserver hkp://keyserver.ubuntu.com:80 recv
Bước 2: Thêm repo của MongoDB echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
Bước 3: Cập nhật lại packages sudo apt-get update
Bước 4: Cài đặt MongoDB sudo apt-get install -y mongodb-org
Bước 5: Khởi động MongoDB sudo service mongod start
Sau khi hoàn thành xong, bạn có thể kiểm tra xem trạng thái cài đặt MongoDB sudo service mongod status
Kết quả như bên hình dưới đây là thành công mỹ mãn
Hình 5.1: Khởi động dịch vụ MongoDB
Sau khi cài đặt dịch vụ MongoDB, nó sẽ hoạt động ngầm Để dễ dàng tương tác và quan sát dữ liệu đã lưu cũng như chỉnh sửa khi cần, bạn cần cài đặt thêm một công cụ hỗ trợ.
Trên trang chủ MongoDB có giới thiệu công cụ MongoDB Compass Tuy nhiên, mình khuyến khích dùng Robo3T, vừa miễn phí lại dễ sử dụng hơn rất nhiều
Kết nối và quản lý MongoDB với Robo 3T
Robo 3T, previously known as Robomongo, is a cross-platform open-source GUI tool for managing MongoDB, compatible with Windows, Linux, and MacOS To get started with Robo 3T, you can download the software from [here](https://robomongo.org/download).
Với Ubuntu thì bạn chỉ việc download về, giải nén và click đúp vào bin/robo3t là được
Sau khi khởi động phần mềm, bạn cần thiết lập kết nối tới dịch vụ MongoDB Nếu kết nối trên localhost, bạn chỉ cần nhấn nút lưu mà không cần thực hiện thêm bước nào khác.
Hình 5.2: Màn hình thiết lập kết nối tới MongoDB
Sau khi hoàn tất cài đặt môi trường và công cụ, chúng ta sẽ tiếp tục với dự án blog sử dụng Node.js Để tương tác với MongoDB từ Node.js, bạn cần cài đặt thêm một module hỗ trợ, và Mongoose là lựa chọn phổ biến và dễ sử dụng nhất.
Mongoose là một thư viện Object Data Modeling (ODM) giúp kết nối giữa Node.js và MongoDB Để biết thêm thông tin về cách cài đặt và số lượt cài đặt, bạn có thể truy cập trang chính thức tại: [npmjs.com/package/mongoose](https://www.npmjs.com/package/mongoose).
Việc cài đặt Mongoose cũng rất đơn giản, giống như bao module khác của Node.js npm install mongoose
To connect MongoDB from Node.js, first open your index.js file and include the following code: `const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/my_database', {useNewUrlParser: true});`.
Kết nối với cơ sở dữ liệu trong Mongoose được thực hiện thông qua hàm mongoose.connect(), với tham số là đường dẫn kết nối và tên cơ sở dữ liệu Trong cuốn sách này, do MongoDB được cài đặt trên cùng một máy tính, chúng ta sẽ sử dụng localhost và my_database là tên của cơ sở dữ liệu đã tạo Một điểm thú vị là nếu cơ sở dữ liệu chưa tồn tại, MongoDB sẽ tự động tạo ra cho chúng ta trong quá trình kết nối.
Ứng dụng MongoDB vào dự án
Chúc mừng bạn đã đi được một chặng đường dài trong việc ứng dụng MongoDB vào dự án của mình Ở phần trước, chúng ta đã tìm hiểu những kiến thức cơ bản về MongoDB và hoàn tất việc cài đặt môi trường Bây giờ, chúng ta sẽ thực hành lưu trữ và quản lý các bài viết trong blog bằng MongoDB.
Quay trở lại mã nguồn của dự án trong cuốn sách Chúng ta sẽ hoàn thiện tính năng tạo mới một post của blog
Trong thư mục views, tạo file create.ejs bằng cách sao chép mã nguồn từ contact.ejs Giao diện của trang tạo bài viết mới sẽ tương tự như các trang khác với thanh điều hướng, header và footer Tuy nhiên, cần thay đổi nội dung thẻ h1 thành: Create New Post.
Next, we register a route for creating a new post by adding the following code to index.js: app.get('/posts/new', (req, res) => { res.render('create') });
Giờ chúng ta sẽ thêm menu tạo post mới trên thanh navbar Bạn chỉ cần chỉnh sửa lại views/layouts/navbar.ejs Chính là phần mình in đậm.