Học Node.js với ví dụ chạy trực tiếp
Hướng dẫn Node.js miễn phí với ví dụ chạy ngay trên trang: tệp, module, event loop, máy chủ Express để bạn gửi request, MongoDB và JWT. Sửa code rồi chạy lại.
Bắt đầu khóa họcBắt đầu
- Node.js là gìNode.js là một runtime chạy JavaScript bên ngoài trình duyệt, trên máy chủ và trong terminal. Node.js không phải ngôn ngữ, cũng không phải framework: nó gồm V8, một event loop và các API cho tệp, mạng và tiến trình.
- Node.js và JavaScriptJavaScript là ngôn ngữ; Node.js là chương trình chạy ngôn ngữ đó bên ngoài trình duyệt. Cú pháp giống hệt nhau, nhưng các biến toàn cục và API có sẵn xung quanh code của bạn thì khác.
- process.argvprocess.argv là một mảng chứa dòng lệnh đã khởi chạy chương trình: tệp thực thi node, đường dẫn script, rồi đến từng tham số bạn gõ. Dùng process.argv.slice(2) để chỉ lấy các tham số của bạn.
- process.envprocess.env là một đối tượng chứa các biến môi trường có sẵn khi chương trình Node.js khởi chạy. Mỗi giá trị là chuỗi hoặc undefined, nên bạn tự chuyển đổi số và boolean, và cho mỗi biến một giá trị mặc định.
- Đọc dữ liệu nhậpNode.js không có hàm prompt(). Để hỏi người dùng trong terminal, hãy tạo một interface readline trên process.stdin rồi gọi question(), hoặc await nó với readline/promises.
Tệp và đường dẫn
- fs.readFileĐọc tệp trong Node.js bằng fs.readFile (callback), fs.readFileSync hoặc await readFile từ fs/promises. Truyền 'utf8' để nhận chuỗi, và xử lý ENOENT khi tệp không tồn tại.
- fs.writeFileGhi tệp trong Node.js bằng fs.writeFile, fs.writeFileSync hoặc await writeFile từ fs/promises. Tệp được tạo nếu chưa có và bị ghi đè nếu đã tồn tại; dùng appendFile để ghi thêm vào cuối.
- fs/promisesfs/promises là phiên bản promise của module fs trong Node: readFile, writeFile, readdir, stat, mkdir, rm và rename đều trả về promise để bạn await, và lỗi được bắt bằng try/catch.
- Module pathModule path ghép và tách đường dẫn tệp theo đúng quy tắc của hệ điều hành. path.join nối các đoạn lại với nhau; path.resolve biến chúng thành đường dẫn tuyệt đối, bắt đầu từ thư mục hiện tại.
Node bất đồng bộ
- Event loopEvent loop của Node.js chạy callback theo các phase (timers, poll, check, close), và giữa mỗi callback nó làm rỗng hàng đợi process.nextTick rồi đến hàng đợi promise. Chạy các ví dụ để thấy thứ tự chính xác.
- EventEmitterEventEmitter trong module events của Node cho phép một đối tượng phát ra các sự kiện có tên bằng emit, và để code khác phản hồi bằng on hoặc once. Listener chạy đồng bộ, theo thứ tự được thêm vào.
HTTP và Express
- HTTP server`http.createServer()` nhận một hàm chạy cho mỗi request với `req` và `res`. Bạn đọc phương thức và URL từ `req`, rồi đặt status, header và body trên `res` và gọi `res.end()`.
- Routing trong ExpressMột route trong Express gồm phương thức, đường dẫn và handler: `app.get('/users/:id', handler)`. Gom các route liên quan vào một `express.Router()` và gắn nó dưới một tiền tố bằng `app.use('/api', router)`.
- Middleware trong ExpressMiddleware trong Express là một hàm `(req, res, next)` chạy trước route handler. Nó có thể đọc hoặc thay đổi request, kết thúc request bằng một response, hoặc gọi `next()` để chuyển request đi tiếp.
- req.params, query, body`req.params` chứa các phần có tên trong đường dẫn (`/users/:id`), `req.query` chứa query string (`?sort=new`), còn `req.body` chứa body của request đã được parse, và nó là `undefined` cho đến khi bạn thêm một body parser như `express.json()`.
- Xử lý lỗiError handler trong Express là một middleware nhận bốn đối số, `(err, req, res, next)`, được đăng ký sau các route. Express 5 chuyển đến đó lỗi bị ném ra, các lệnh gọi `next(err)` và promise bị reject từ handler async.
- express.static`app.use(express.static(path.join(__dirname, 'public')))` phục vụ mọi tệp trong thư mục `public` tại URL tương ứng: `public/style.css` trả lời `/style.css`. Thêm đường dẫn gắn để phục vụ chúng dưới một tiền tố.
- CORS trong ExpressLỗi CORS nghĩa là trình duyệt đã chặn một trang đọc response từ API của bạn vì response đó không cho phép origin của trang. Hãy sửa ở phía máy chủ bằng cách gửi `Access-Control-Allow-Origin` và trả lời request preflight `OPTIONS`, tự viết hoặc dùng package `cors`.
Dữ liệu và xác thực
- MongoDBDùng MongoDB từ Node.js với driver mongodb chính thức: kết nối bằng MongoClient, rồi thêm, tìm, cập nhật và xóa document trong một collection, tất cả bằng async/await.
- JWTJWT là một token đã ký gồm ba phần base64url, được server cấp khi đăng nhập và kiểm tra ở mọi request. Trong Node.js, bạn ký và xác thực JWT bằng package jose hoặc jsonwebtoken cùng một khóa bí mật.