Để làmđiều này, chúng tôi sẽ đặt nó trong tệp riêng của nó được gọi làgreeting.js const greeting = functionname { console.log`Hello ${name}, welcome to NodeJS` } - Theo mặc định NodeJS k
Trang 1Email: clfish@vnn.vn Website: http://www.clfish.com
“CẢI TIẾN HOẶC LÀ CHẾT”
BÁO CÁO NGHIÊN CỨU VỀ CÁCH TẠO BACK END TRONG JAVASRIPT BẰNG
NODE.JS
Duyệt Ban Giám Đốc Người thực hiện
Nguyễn Xuân Hải Nguyễn Trung Hậu
Tháng 08/ 2022
Trang 2DANH MỤC TÀI LIỆU
1 I: Giới thiệu về Node.js
3 III: Thao tác với tệp và thư mục NodeJS
4 IV: Tạo HTTP Server đầu tiên
9 IX: Tài liệu tham khảo
Cửu Long, ngày 16 tháng 08 năm 2022
Duyệt BGĐ Người lập
Trang 3I: GIỚI THIỆU VỀ NODE.JS.
- NodeJS cho phép bạn chạy mã JavaScript bên ngoài trình duyệt
- Node.js là một môi trường máy chủ mã nguồn mở, miễn phí sử dụngngôn ngữ JavaScript để tạo các ứng dụng web phía máy chủ (phụ trợ)
- Node.js hoạt động trên các nền tảng khác nhau (Windows, Linux, Unix, Mac OS X, v.v.) Với Node.js chúng ta có thể xây dựng một ứngdụng web nhanh chóng và có khả năng mở rộng cao
- Sử dụng Node.js cũng có nghĩa là chúng ta có thể sử dụng JavaScript trên toàn bộ ngăn xếp, tức là cùng một ngôn ngữ cho frontend và backend Vì vậy, phát triển nhanh chóng và hiệu quả hơn
- Node.js có một thư viện khổng lồ gồm các gói làm sẵn sẽ giúp bạn tiết kiệm rất nhiều thời gian Các thư viện này được quản lý bởi NPM (Node Package Manager)
- Một tính năng đặc biệt của Node.js là nó sử dụng lập trình không đồng bộ (chạy nhiều tác vụ cùng một lúc) so với lập trình đồng bộ (chạy từng tác vụ một) được tìm thấy trên nhiều ngôn ngữ lập trình phía máy chủ như PHP và Ruby
Trang 4II: NODEJS MODULE SYSTEM.
const name = 'Mike Taylor'
const greeting = function(name) { console.log(`Hello ${name}, welcome to NodeJS`)
} greeting(name)
- Có thể thú vị khi làm cho module lời chào có thể tái sử dụng Để làmđiều này, chúng tôi sẽ đặt nó trong tệp riêng của nó được gọi làgreeting.js
const greeting = function(name) { console.log(`Hello ${name}, welcome to NodeJS`)
}
- Theo mặc định NodeJS không cho phép sử dụng chức năng này từ mộtmodule khác Để làm điều này, bạn phải chỉ ra cho module những yếu tốnào có thể xuất được:
const greeting = function(name) { console.log (`Hello ${name}, welcome to NodeJS`)
} module.exports = greeting
- Lưu ý ở đây dòng cuối cùng 'module.exports = greeting' , chức năngnày cho phép sử dụng hàm lời chào từ một module khác
Trang 5- Từ app.js giờ đây bạn có thể tải module này bằng chức năng 'require'
const greeting = require('./greeting.js')
const name = 'Mike Taylor' greeting(name)
- Hàm 'require' sẽ tạo một tham chiếu với module lời chào và đặt thamchiếu này trong biến lời chào const (biến này có thể được gọi là tên khácngoài lời chào)
- Lưu ý rằng hàm require ('./greeting.js') sử dụng đường dẫn './' điều nàycho phép chỉ ra cho NodeJS rằng module nằm trong cùng thư mụcapp.js của chúng ta
- Do đó, nhiều lần xuất được thực hiện với một đối tượng có chứa một
Trang 6modules.exports = hello // app.js
const hello = require('./ hello.js')
- Ngay sau khi NodeJS thực thi dòng này, module hello cũng được thựcthi Trong ví dụ này, module chỉ thực hiện xuất nhưng nếu module chứa
mã thì nó sẽ được thực thi, đây là một ví dụ
// hello.js
const hello = function() { console.log('Hello World') }
console.log('Hello Node!') modules.exports = hello
// app.js const hello = require('./ hello.js') Hello()
- Nếu bạn đã khởi chạy app.js, bạn sẽ thấy rằng nó sẽ hiển thị 'HelloNode!' trước 'Hello World' vì như đã đề cập, 'require' thực thi module
- Hãy tính đến thực tế này khi bạn tạo các module của mình để tránhhành vi không mong muốn
Trang 7III: THAO TÁC VỚI TỆP VÀ THƯ MỤC NODEJS.
2 Module Path - Module 'path' chứa các chức năng cho phép xử lý thích hợp các vị trí
thư mục và tệp
- Để tham chiếu một module, chỉ cần sử dụng tên của module đó
const path = require('path')
products_path = '/data/products/products.json' products_file = path.basename(products_path) console.log(products_file) // products.json
- Hàm path.basename() cho phép bạn chỉ trả về tên của tệp để trong trường hợp này là 'products.json'
- Một hàm tiện dụng khác là path.join() Chức năng này cho phép bạn nối với nhau một hoặc nhiều thư mục và tệp ví dụ:
const path = require('path')
data_folder = '/data/' products_folder = '/products' products_file = 'products.json'
const full_path = path.join(data_folder, products_folder, products_file)
/data/products/products.json
- path.join() ghép nối tất cả các đoạn đường dẫn đã cho lại với nhau bằng cách sử dụng dấu phân cách dành riêng cho nền tảng làm dấu phân cách, sau đó chuẩn hóa đường dẫn kết quả
Trang 8- Cuối cùng, đôi khi bạn muốn có đường dẫn tuyệt đối trên máy chủ
const path = require('path')
data_folder = '/data/' products_folder = '/products' products_file = 'products.json'
const full_path = path.join(data_folder, products_folder, products_file)
const abs_path = path.resolve( dirname, 'data', 'products', 'products.json')
console.log(abs_path) //
/Users/username/Documents/dev/learn_node/data/ products/products.json
- path.resolve() xử lý chuỗi các đường dẫn từ phải sang trái, với mỗiđường dẫn tiếp theo được thêm vào trước cho đến khi một đường dẫntuyệt đối được xây dựng
File System - Chắc chắn là một trong những module được sử dụng nhiều nhất,module này cho phép bạn xử lý các tệp và thư mục trên máy chủ
- Module FS cho phép thao tác các tệp và thư mục theo hai cách khácnhau Bạn có thể làm điều này ở chế độ đồng bộ hoặc không đồng bộ
Phương pháp nào để sử dụng?
- Nó phụ thuộc vào loại ứng dụng bạn muốn phát triển Ví dụ: nếu bạnđang phát triển một máy chủ web trong trường hợp này, tốt hơn là,không phải nói là cần thiết, sử dụng một chức năng không đồng bộ Mộtchức năng đồng bộ sẽ chặn việc thực thi máy chủ không chỉ cho người
Trang 9dùng hiện tại mà còn chặn tất cả người dùng.
- Mặt khác, trong một số trường hợp rất chính xác, việc sử dụng mộtchức năng đồng bộ có thể được chứng minh Ví dụ: trước khi khởi chạymáy chủ web, nếu bạn cần đọc tệp cấu hình, trong trường hợp này, chứcnăng đồng bộ đảm bảo rằng bạn sẽ đọc tệp trước khi máy chủ được khởichạy
- Hãy xem một ví dụ về việc sử dụng module 'fs' với hai loại hàm: Chứcnăng đồng bộ
// app.js const fs = require('fs')
const data = fs.readFileSync('info.txt', 'utf-8') console.log(data) // file content
console.log('The file has been read')
- Ở đây kết quả có thể dễ dàng dự đoán được, mã sẽ được thực thi từngdòng
- Hàm không đồng bộ
const fs = require('fs')
const info = fs.readFile('info.txt', 'utf-8', (err, data)
=> { console.log(data) })
console.log('The file has been read')
- Ở đây, NodeJS sẽ không đợi hàm quay trở lại để tiếp tục thực thi
- Điều này sẽ dẫn đến hậu quả của việc hiển thị 'Tệp đã được đọc' trước
và khi readFile() đã hoàn thành công việc của nó, NodeJS sẽ thực thibảng điều khiển hàm callback.log (data)
Trang 10fs.writeFile('info.txt', data, 'utf-8', (err) => { console.log('File created')
- Nếu tệp không tồn tại, bạn có thể trả về lỗi
const info = fs.readFile('info.txt', 'utf-8', (err, data)
=> {
if (err) console.log(err) else
console.log(data) })
- Cũng có thể đọc một tệp với readFile nhưng sử dụng lời hứa
const fs = require('fs').promises
const start = async () => { const data = await fs.readFile('info.txt', 'utf8') console.log(data)
} start()
- Nhập khác nhau và cú pháp khác nhau nhưng cùng một kết quảSao chép tệp
- Để sao chép một tập tin, chúng tôi sử dụng chức năng copyFile
fs.copyFile('info.txt', 'info2.txt', (err) => {
if (err) return console.error(err)
Trang 11console.log('File copied') })
Tạo thư mục
- Để tạo một thư mục, chúng tôi sử dụng chức năng mkdir
fs.mkdir('data', (err) => { console.log('Data folder created') })
- Thư mục được tạo bên trong thư mục hiện tại
Liệt kê các tệp trong một thư mục
- Có thể lấy danh sách các tệp trong một thư mục
fs.readdir('.', (err, files) => { console.log(files)
})
- '.' đại diện cho các tệp hiên tại là một mảng chứa tất cả tên tệp thư mục
Đổi tên tệp
- Để đổi tên một tập tin, chúng ta sử dụng hàm rename()
fs.rename('info.txt', 'data.txt', (err) => {
if (err) return console.log(err) console.log('File renamed') })
Trang 12IV: TẠO HTTP SERVER ĐẦU TIÊN.
})
- Hãy xem từng dòng các bước khác nhau để tạo máy chủ
- Đang tải module HTTP
const http = require('http')
- Tạo máy chủ với chức năng gọi lại Lưu ý rằng có hai tham số được chuyển đến hàm: req và res
req: sẽ chứa thông tin về yêu cầu đến
res: sẽ được sử dụng để xác định phản hồi đi
const server = http.createServer((req, res) => { // send the response
res.end('Hello World from the server') })
Trang 13- res.end() cho máy chủ biết rằng phản hồi đã hoàn tất và bây giờ có thể được gửi
- Khởi động máy chủ Máy chủ sẽ đợi và đọc các yêu cầu đến trên cổng 5000
server.listen(5000, 'localhost', () => { console.log('Server is listening at localhost on port 5000')
})
- Đây là một vòng lặp vô tận Mỗi khi một yêu cầu sẽ được gửi đến máy chủ của chúng tôi tại cổng 5000 (ví dụ: localhost: 5000), máy chủ sẽ thực hiện cuộc gọi lại (xem khối mã trước đó) và do đó trong trường hợp này gửi phản hồi 'Xin chào thế giới từ máy chủ'
- Nếu bạn muốn kiểm tra máy chủ này, hãy khởi chạy ứng dụng
$ node app.js Server is listening at localhost on port 5000
- Mở trình duyệt của bạn và truy cập localhost: 5000
- Thông báo 'Hello World from the server' sẽ hiển thị trong trình duyệtcủa bạn Trong thực tế, nếu bạn truy cập bất kỳ trang nào, ví dụ:
localhost: 5000 / về cùng một thông báo sẽ luôn được hiển thị
- Thông tin đường dẫn được bao gồm trong yêu cầu
- Để đọc thông tin về yêu cầu, chúng tôi sẽ sử dụng đối tượng 'req'
mà như bạn biết chứa tất cả thông tin của yêu cầu
- Cụ thể, đường dẫn url nằm trong thuộc tính 'req.url'
- Đây là một ví dụ về một máy chủ HTTP nhỏ, tùy thuộc vào url nhận được, hiển thị một trang khác
const http = require('http')
const server = http.createServer((req, res) => {
if (req.url === '/') { res.end('<h1>Home page</h1>') } else if (req.url === '/about') { res.end('<h1>About page</h1>') } else {
res.end('page not found') }
}) server.listen(5000, 'localhost', () => {
Trang 14console.log('Server is listening at localhost on port 5000')
})
3 Tiêu đề HTTP
- Tiêu đề HTTP cho phép máy khách và máy chủ truyền thông tin bổ sung cùng với yêu cầu hoặc phản hồi
- Ví dụ: Tiêu đề của một yêu cầu có thể chứa định dạng nội dung của
nó ex.HTML hoặc JSON và / hoặc thông tin liên quan để xác thực người dùng
res.end('<h1>Page not found</h1>')
- Chức năng writeHead cho phép bạn chỉ định loại nội dung của tin nhắn, có thể là 'text / html'
- Khi chạy hàm res.end() NodeJS sẽ bao gồm Header vào response
5
Máy chủ
HTTP đầu
tiên của bạn
- Thì đấy, bạn đã tạo máy chủ HTTP đầu tiên của mình Mặc dù đây
là một máy chủ rất cơ bản vào lúc này, hãy nhớ rằng máy chủ HTTP chỉ đơn giản là một chuỗi các yêu cầu và phản hồi
- Vì vậy, ở dạng đơn giản nhất, ứng dụng web của bạn sẽ làm được điều đó Điều đó có nghĩa là, xử lý các yêu cầu và trả lại phản hồi
Trang 15V: NODE PACKAGE MANAGER (NPM).
- NPM đã được cài đặt sẵn với NodeJS Nó là một ứng dụng dòng lệnh
sẽ cho phép cài đặt gói bạn chọn
- NPM cung cấp một hệ thống cho phép quản lý các gói đã cài đặt vàphiên bản của chúng Việc quản lý này được thực hiện với sự trợ giúpcủa một tệp có tên 'package.json'
- Tệp 'package.json' này là duy nhất cho ứng dụng của chúng ta và chứadanh sách các 'dependencies' của dự án của chúng ta Điều đó có nghĩa
là danh sách tất cả các gói đã cài đặt và phiên bản của chúng
- Tệp này cũng chứa các thông tin khác về dự án của bạn như tên, tác giả
và tệp bắt đầu (tệp đầu tiên mà Node.jS sẽ chạy) Cũng có thể tạo cáclệnh script' để khởi chạy các chức năng nhất định như khởi chạy máychủ hoặc biên dịch và thực thi dự án
- Bạn có thể tạo tệp 'package.json' này theo cách thủ công hoặc chạylệnh NPM để thực hiện tự động
Trang 16- Sau khi gói được cài đặt, bạn có thể tham khảo tệp 'package.json', bạn
sẽ tìm thấy gói 'slugify' được liệt kê trong danh sách 'dependencies' ởđó:
{ "dependencies": { "slugify": "^1.6.0"
} }
- Lưu ý rằng các tệp nguồn của các gói này đều đã được sao chép vàothư mục 'node_modules'
- Gói này hiện có thể được sử dụng trong ứng dụng của bạn
const slugify = require('slugify')
console.log(slugify('My New Web Site')) // My-New-Web-Site
- NPM cũng có thể cài đặt các gói trên toàn cầu để bất kỳ ứng dụngNode.js nào trên máy tính của bạn đều có thể nhập và sử dụng các gói đãcài đặt NPM cài đặt các gói toàn cục trong thư mục//local/lib/node_modules
- Thêm -g vào lệnh install để cài đặt gói trên toàn cục
$ npm install create-react-app -g
- Hầu hết thời gian, bạn sẽ cần đặc quyền của quản trị viên để cài đặtmột gói trên toàn cầu Trong trường hợp này, hãy sử dụng lệnh sudo(trên Mac)
$ sudo npm install create-react-app -g
bản
- Chúng ta có thể thấy số phiên bản của gói trong tệp 'package.json'
"dependencies": { "slugify": "^1.4.7"
}
- Số version (eg 1.4.7):
Major version (1): Phiên bản mới với những thay đổi đột phá
Trang 17 Minor version (4): Tính năng mới nhưng không có thay đổi độtphá
Patch version (7): Chỉ các lỗi mới được sửa
Version prefix: ^ 1.4.7: Chấp nhận cập nhật phiên bản phụ ~ 1.4.7: Chỉ chấp nhận cập nhật phiên bản vá
1.4.7: Chấp nhận tất cả các bản cập nhật phiên bản (không được khuyến nghị)
nút (NPX)
- npx là viết tắt của Node Package thực thi Nó là một công cụ được thiết kế đặc biệt để thực thi các gói Khi bạn khởi chạy việc thực thi một gói bằng công cụ này, npx sẽ tìm trong biến "PATH" của máy tính sau đó trong các tệp nhị phân của các mô-đun dự án để khởi chạy lệnh Nếu nó chưa tìm thấy nó, công cụ thậm chí có thể lên web để tìm lệnh và sau đó thực thi nó
- Gói được thực thi trong thư mục hiện tại npx cũng có thể được sử dụng trong phần "tập lệnh" của tệp "packages.json", để đặt các lệnh khởi chạy máy chủ hoặc nền tảng khi khởi động
Khởi chạy một gói với npx
npx creat-react-app my-app
Trang 187 Gói nodemon
- Khi bạn phát triển một ứng dụng NodeJS, mỗi khi bạn sửa đổi mã của mình, bạn phải dừng máy chủ và khởi động lại ứng dụng của mình Đó là một sự lãng phí thời gian rất lớn
- May mắn thay, có một công cụ để khắc phục điều này: nodemonnodemon là một công cụ giúp phát triển các ứng dụng dựa trên Node.js bằng cách tự động khởi động lại ứng dụng Node khi phát hiệnthấy các thay đổi tệp trong thư mục
- nodemon không yêu cầu bất kỳ sửa đổi bổ sung nào đối với mã hoặcphương pháp phát triển của bạn nodemon là một wrapper thay thế cho Node Để sử dụng nodemon, hãy thay thế nút từ trên dòng lệnh khi chạy tập lệnh của bạn
- Ví dụ sử dụng để khởi chạy / kiểm tra ứng dụng của bạn:
$ npx nodemon app.js
- Chỉ cài đặt mô-đun trong chế độ phát triển
$ sudo npm install nodemon -D
- Cũng có thể cài đặt gói nodemon trên toàn cầu Bằng cách này, bạn
Trang 19VI: NODEJS HOẠT ĐỘNG NHƯ THẾ NÀO?
libuv
- Là một thư viện mã nguồn mở, được viết bằng C ++ chuyên thực thi
i / o không đồng bộ (ví dụ: Hệ thống tệp, Mạng và hơn thế nữa)
- libuv triển khai hai tính năng rất quan trọng của NodeJS: Event Loop
- Hãy tưởng tượng, ví dụ, nếu có 100.000 người dùng trên trang web cùng một lúc yêu cầu quyền truy cập vào cơ sở dữ liệu, thời gian phảnhồi sẽ nhanh chóng trở nên không thể chấp nhận được Đây là lý do tại sao NodeJS cần quản lý hiệu quả việc thực thi mã không đồng