Cookie là những dữ liệu nhỏ được gửi tới một website và được lưu trữ trong trình duyệt web của người dùng khi người dùng đang truy cập trang web đó.
Mỗi lần người dùng tải lại trang web, trình duyệt sẽ gửi dữ liệu được lưu trữ lên website hoặc máy chủ để có thể phân biệt được các hành động trước đó của người dùng.
8.1 Cài đặt cookie-parser
Để sử dụng cookie trong express các bạn phải cài đặt thêm các middleware hỗ trợ phân tích cookie. Trong bài này tôi sẽ hướng dẫn cho các bạn sử dụng cookie thông
qua middleware bên thứ ba là cookie-parser
Cú pháp cài đặt
npm install cookie-parse
8.2 Sử dụng cookie-parser
Require module cookie-parse vào ứng dụng của bạn. var express = require('express');
var cookieParser = require('cookie-parser'); var app = express();
app.use(cookieParser());
Sau khi sử dụng cookie-parser sẽ tự động thêm vào đối tượng request thuộc
tính cookies , request.cookies là đối tượng sẽ chứa toàn bộ các cookie đã tạo ra. Để tạo ra một cookie mới các bạn có thể sử dụng cú pháp sau.
response.cookie(cookie_name, cookie_value [, options]) Trong đó
cookie_namelà tên cookie muốn đặt , sẽ lưu vào đối tượng cookies
cookie_value là giá trị của cookie
options các lựa chọn thiết thập khác Ví dụ: tạo mới cookie
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 45 var express = require('express');
var app = express();
var cookieParser = require('cookie-parser'); app.use(cookieParser())
app.get('/cookie', function(request, response){
response.cookie('time', new Date()).send('Đã thiết lập cookie'); });
app.listen(3000)
Để kiểm tra cookie đã thiết lập hay chưa, các bạn hãy thử truy cập tới địa chỉ http://localhost:3000/cookie và chuyển đến màn hình console (F12 -> console) của
trình duyệt và viết document.cookie để kiểm tra.
Để kiểm tra một cookie được gửi đến máy chủ bạn có thể chạy đoãn mã sau để kiểm tra.
File server.js
var express = require('express'); var app = express();
var cookieParser = require('cookie-parser'); app.use(cookieParser())
app.get('/cookie', function(request, response){
response.cookie('time', new Date()).send('Đã thiết lập cookie'); });
app.get('/', function(req, res) {
console.log("Cookies : ", req.cookies); });
app.listen(3000)
8.3 Đặt thời gian sống cho cookie
Để đặt thời gian sống cho cookie các bạn có thể sử dụng cú pháp.
res.cookie(name , 'value', {expire : new Date() + 9999}); Thời gian sống của cookie sẽ được tính bằng mili giây.
Một cách khác để thiết đặt thời gian sống của cookie là sử dụng thuộc tính maxAge
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 46
8.4 Xóa cookie hiện tại
Các cookie hiện tại có thể xóa dễ dàng bằng cách sử dụng phương thức clearCookie tham số truyền vào là tên cookie mà bạn muốn xóa.
Ví dụ app.get('/clearcookie', function(req,res){ clearCookie('cookie_name'); res.send('Cookie deleted'); }); 9. Sử dụng session 9.1 Định nghĩa về Session
Session là một tập tin nhỏ được lưu trữ trên server
Là một khái niệm phổ biến được dùng trong lập trình các website có kết nối với cơ sở dữ liệu database. Đặc biệt các chức năng như đăng nhập, đăng xuất người dùng sẽ khó có thể thực hiện được nếu thiếu session.
9.2 Lý do session ra đời
Việc giao tiếp giữa trình duyệt với máy chủ của website (hay webserver) được thực hiện thông qua hàng loạt các router trên mạng internet. Một vấn đề đặt ra trong quá trình giao tiếp này đó là làm sao để phân được giữa cá trình duyệt (máy tính) khác nhau. Ví dụ như bạn truy cập một trang bán hàng thì máy chủ cần:
Phân biệt được các máy tính (trình duyệt) khác nhau: nói cách khác máy chủ cần phân biệt được trong những lượt truy cập gửi tới máy chủ thì đâu là từ máy tính bạn và đâu là của người khác.
Lưu thông tin của giỏ hàng: ví dụ như thông tin về số lượng hàng hoá bạn đã thêm vào giỏ hàng
Bạn có thể tuỳ ý quyết định xem nên lưu trữ những thông tin nào vào Session. Nhưng thông thường chúng ta chỉ nên lưu những thông tin tạm thời trong session ví dụ như số lượng sản phẩm người dùng đã thêm vào giỏ nhưng chưa mua, hay những nhật xét đang được viết và lưu dưới dạng nháp nhưng chưa gửi đi. Những dữ liệu sử dụng lâu dài như nội dung nhận xét đã được gửi đi hay số sản phẩm đã được mua thì nên được thực hiện ở máy chủ chứa cơ sở dữ liệu.
9.3 Phân biệt session của các trình duyệt khác nhau
Sau khi chúng ta (các lập trình viên website) tạo ra một tập tin session trên máy
chủ để lưu trữ dữ liệu tạm thời của người dùng thì chúng ta cần phải phân biệt được session nào là của người dùng nào. Để làm điều này thì với mỗi session tạo ra
chúng ta cần tạo một cookie trên trình duyệt của người dùng tương ứng với
nó.Cookie là một mẩu tin nhỏ có thể được trình duyệttạo ra khi người dùng duyệt web
và dùng để lưu trữ thông tin của người dùng ở phía trình duyệt (phía máy khách).
Cookie có thể được tạo ra mà không yêu cầu cần phải tạo ra 1 session trên server
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 47
ứng với nó để xác định xem session này được sử dụng cho trình duyệt nào. Nhờ sử
dụng cookie mà chúng ta có thể phân biệt được giữa các session khác nhau của các trình duyệt khác nhau.
9.4 Sử dụng session trong node.js
Để sử dụng được session trong ứng dụng node.js chúng các bạn có thể cài thêm middleware trung gian express-session.
Cài đặtexpress-session
Cú pháp
npm install express-session
Sử dụng session
express-session là một middleware vì thế để sử dụng chúng ta sử dụng phương thức use của đối tượng app
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 48
Bài 3. Làm việc với MySQL Database Server trong NodeJS 1. Kết nối với MySQL Database Server
Trong phần này, chúng ta sẽ tìm hiểu cách kết nối với MySQL Database server với ứng dụng Node.js
1.1 Cài đặt package mysql cho Node.js
Có nhiều tùy chọn để chúng ta có thể tương tác với MySQL từ một ứng dụng
Node.js. Trong hướng dẫn này, tôi sẽ hướng dẫn bạn cách sử dụng package MySQL
cho Node.js được gọi là mysqljs/mysql
Để sử dụng package này các bạn có thể tải xuống từ kho NPM với lệnh sau npm install mysql
Tạo file connect.js trong thư mục mà bạn dùng để chạy các vị dụ về node.js để
lưu trữ code kết nối tới MySQL
Tôi sẽ sử dụng database với tên viet_pro_mysql . Bạn nào chưa có kiến thức cơ
bản về MySQL có thể tham khảo các bài viết hướng dẫn về MySQL ở trên
trang https://thaygiaoquocdan.vn
1.2 Kết nối với MySQL Database Server bằng Node.js
Trước tiên, nhập khẩu module mysql bằng câu lệnh sau.
var mysql = require('mysql');
Thứ hai, tạo một kết nối đến cơ sở dữ liệu MySQL bằng cách gọi phương thức mysql.createConnection() và cung cấp các thông tin chi tiết về máy chủ MySQL như tên máy chủ (host), người dùng (user), mật khẩu (password) và tên cơ sở
dũ liệu (database) như sau.
let connection = mysql.createConnection({ host: 'localhost',
user: 'root', password: '',
database: 'viet_pro_mysql' });
Trong ví dụ này, chúng ta đã tạo một kết nối đến cơ sở dữ liệu viet_pro_mysql trong máy chủ cục bộ của các bạn.
Thứ ba,gọi phương thức connect() trong đối tượng connection để kết tối tới máy
chủ cơ sở dữ liệu.
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 49 if (err) {
return console.error('error: ' + err.message); }
console.log('Đã kết nối thành công tới MYSQL Server.'); });
Phương thức connect() chấp nhận một hàm gọị lại có tham số err trong đó cung
cấp các thông tin nếu xảy ra lỗi.
Để kiểm tra kết nối được tới cơ sở dữ liệu hay chưa các bạn chạy lệnh node connect
1.3 Đóng kết nối cơ sở dữ liệu
Để đóng kết nối cơ sở dữ liệu, bạn gọi phương thức end() trên đối
tượng connection.
Phương thức end() phải đảm bảo tất cá các yêu cầu đã được thực thi hết trước khi
đóng kết cơ sở dữ liệu.
connection.end(function(err) { if (err) {
return console.log('error:' + err.message); }
console.log('Đã đóng kết nối tới cơ sở dữ liệu.'); });
Để bắt buộc đóng kết nối ngay lập tức, bạn có thể sử dụng phương thức destroy() . Phương thức destroy() đảm bảo rằng không có quá nhiều callbacks hoặc event được kích hoạt khi kết nối.
connection.destroy();
2. Tạo bảng trong MySQL bằng Node.js
Để tạo một bảng từ node.js, các bạn sử dụng các bước sau. Kết nối tới máy chủ cơ sở dữ liệu MySQL
Gọi phương thức query() trên đối tượng connection để thực thi câu lệnh tạo
bảng CREATE TABLE.
Đóng kết nối cơ sở dữ liệu
Ví dụ dưới đây sẽ hướng dẫn cho bạn cách kết nối tới database viet_pro_mysql và thực hiện câu lệnh tạo bảng.
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 50 var mysql = require("mysql");
var connection = mysql.createConnection({ host: "127.0.0.1", user: "root", database: "viet_pro_mysql", password: "" }); connection.connect(function(err) { if (err) { console.error("Lỗi:" + err); }
console.log("Kết nối thành công tới cơ sở dữ liệu");
});
let createTableTodosQueryString = `create table if not exists todos( id int primary key auto_increment,
title varchar(255)not null,
completed tinyint(1) not null default 0 )`; connection.query(createTableTodosQueryString, function(err, results, fields) { if (err) { console.log(err.message); } }); connection.end(function(err) { if (err) { console.error("Lỗi: " + err); }
console.log("Đã đóng kết nối tới cở sở dữ liệu");
});
Phương thức query() chấp nhận tham số đầu vào là một câu truy vấn và một hàm
callback. Hàm callback có 3 tham số
err: Lưu trữ chi tiết lỗi nếu xảy ra lỗi trong khi thực hiện câu lệnh
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 51
fields : Chứa thông tin về các trường kết quả nếu có Tiến hành chạy chương trình
node query
Truy vấn được thực thi mà không có vấn đề gì xảy ra. Bây giờ các bạn xem trong database xem bảng todos đã được tạo hay chưa.
3. Thêm dữ liệu vào bảng từ Node.js
Để chèn một hàng mới vào bảng, bạn làm theo các bước sau
Thực hiện kết nối với cơ sở dữ liệu
Thực hiện câu lệnh INSERT bằng cách gọi phương thức query() trên đối
tượng connection
Đóng kết nối tới cơsở dữ liệu
Ở đây tôi sẽ tạo ra module config.js để chứa cấu hình kết nối tới database. File config.js let config = { host : 'localhost', user : 'root', password: '', database: 'todoapp' }; module.exports = config; Chèn một hàng vào một bảng
Chương trình insert.js chèn một hàng vào một bảng.
var mysql = require("mysql"); var config = require("./config.js");
var connection = mysql.createConnection(config); // câu lệnh insert
var sql = `INSERT INTO todos(title,completed)
VALUES('Họccách insert dữ liệu vào database',true)`; // thực thi câu lệnh insert
connection.query(sql);
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 52
Thực thi chương trình insert.js
node insert
và kiểm tra lại bảng todos trong CSDL.
Chèn một hàng và trả về ID được chèn
Chương trình dưới đây chèn một hàng mới vào bảng todos và trả về id được chèn
vào.
File insert2.js
let mysql = require('mysql'); let config = require('./config.js');
let connection = mysql.createConnection(config); let stmt = `INSERT INTO todos(title,completed) VALUES(?,?)`;
let todo = ['Chèn hàng mới vào database', false]; // Thực thi truy vấn SQL
connection.query(stmt, todo, (err, results, fields) => { if (err) {
return console.error(err.message); }
// Nhận ID vừa Insert
console.log('Todo Id:' + results.insertId); });
connection.end();
Để chuyển dữ liệu vào câu lệnh Database, bạn sử dụng dấu hỏi (?) làm phần giữ
chỗ.
Trong ví dụ này, tôi sử dụng 2 dấu chấm hỏi (?,?) cho các
trường title và completed
Sau khi truy vấn xong chúng ta có thể lấy id từ thuộc tính insertId từ đối
tượng results .
Chèn nhiều hàng vào cùng một lúc
Chương trình dưới đây chèn nhiều hàng vào bảng todos.
File insert3.js
let mysql = require('mysql'); let config = require('./config.js');
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 53 let connection = mysql.createConnection(config);
// Câu lệnh Insert
let stmt = `INSERT INTO todos(title,completed) VALUES ? `; let todos = [
['Chèn nhiều dữ liệu cùng lúc 1', false], ['Chèn nhiều dữ liệu cùng lúc 1', true] ];
// Thực thi câu lệnh SQL
connection.query(stmt, [todos], (err, results, fields) => { if (err) {
return console.error(err.message); }
// nhận được số hàng đã insert
console.log('Row inserted:' + results.affectedRows); });
// Đóng kết
connection.end();
4. Truy vấn dữ liệu trong CSDL MySQL từ Node.js
Để truy vấn dữ liệu từ một bảng trong MySQL bằng ứng dụng Node.js chúng ta
cần thực hiện theo ba bước sau:
B1: Thiết lập kết nối đến máy chủ cơ sở dữ liệu MySQL
B2: Thực thi một câu lệnh SELECT và xử lý kết quả
B3: Đóng kết nối cơ sở dữ liệu.
4.1 Thực thicâu truy vấn đơn giản
Chương trình dưới đây chọn tất cả dữ liệu từ bảng todos của
database viet_pro_mysql. File select.js
let mysql = require('mysql'); let config = require('./config.js');
let connection = mysql.createConnection(config); let sql = `SELECT * FROM todos`;
connection.query(sql, (error, results, fields) => { if (error) {
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 54 return console.error(error.message); } console.log(results); }); connection.end();
Chạy chương trình select.js
node select
4.2 Chuyển dữ liệu vào câu truy vấn
Chương trình select2.js sau đây chỉ chọn các todo đã hoàn thành.
let mysql = require('mysql'); let config = require('./config.js');
let connection = mysql.createConnection(config);
let sql = `SELECT * FROM todos WHERE completed=?`; connection.query(sql, [true], (error, results, fields) => { if (error) { return console.error(error.message); } console.log(results); }); connection.end();
Trong ví dụ này, tôi sử dụng dấu (?) làm giá trị giữ chỗ của trường đã hoàn
thành.
Khi chúng ta gọi phương thức query() chúng ta đã truyền một mảng làm đối số
thứ hai. Trình giữ chỗ sẽ được thay thế bẳng các giá trị theo thứ tự.
5. Cập nhật dữ liệu trong cơ sở dữ liệu MySQL bằng Node.js
Để cập nhật dữ liệu từ một ứng dụng node.js, bạn sử dụng các bước sau: Kết nối với máy chủ cơ sở dữ liệu MySQL.
Thực hiện câu lệnh UPDATE bằng cách gọi phương thức query() trên đối
tượng connection
Đóng kết nối cơ sở dữ liệu
Ví dụ về cập nhật cơ sở dữ liệu
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 55 let mysql = require('mysql');
let config = require('./config.js');
let connection = mysql.createConnection(config); // Câu lệnh cập nhật
let sql = `UPDATE todos SET completed = ? WHERE id = ?`; let data = [false, 1];
// Thực thi câu lệnh cập nhật
connection.query(sql, data, (error, results, fields) => { if (error){
return console.error(error.message); }
console.log('Rows affected:', results.affectedRows); });
connection.end();
Trong ví dụ này, chúng tôi đã sử dụng trình giữ chỗ (?) trong câ lệnh UPDATE.
Khi chúng ta thực thi câu lệnh UPDATE bằng cách gọi phương thức query() trên
đối tượng kết nối, chúng ta đã chuyển dữ liệu tới câu lệnh UPDATE dưới dạng một
mảng.
Trình giữ chỗ sẽ được thay thế bằng các giá trị trong mảng dữ liệu theo thứ tự.
Trong ví dụ này, complate sẽ được đặt thành false và id sẽ được đặt thành 1.
Đối số results của hàm callback có thuộc tính affectedRows trả về số hàng được
cập nhật bởi câu lệnh UPDATE.
6. Xóa dữ liệu trong MySQL từ Node.js
Để xóa dũ liệu trong CSDL MySQL từ một ứng dụng node.js bạn làm theo các bước sau.
B1: Thiết lập kết nối tới CSDL MySQL
B2: Thực hiện một câu lệnh DELETE bằng cách gọi phương thức query() trên
đối tượng connection.
B3: Ngắt kết nối từ máy chủ CSDL
Ví dụ xóa dữ liệu
Chương trình sau xóa một hàng trong bảng todos dựa trên id của hàng.
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 56 let mysql = require('mysql');
let config = require('./config.js');
let connection = mysql.createConnection(config); // Câu lệnh xóa
let sql = `DELETE FROM todos WHERE id = ?`; // Xóa hàng với id = 1
connection.query(sql, 1, (error, results, fields) => { if (error)
return console.error(error.message);
console.log('Deleted Row(s):', results.affectedRows); });
connection.end();
Trong ví dụ này, tôi sử dụng trình giữ chỗ (?) trong câu lệnh DELETE . Khi
chúng ta gọi phương thức query() trên đối tượng connection để thực hiện câu lệnh,
chúng ta đã chuyển dữ liệu tới câu lệnh DELETE làm đối số thứ hai. Trình giữ chỗ sẽ
được thay thế bằng giá trị đầu vào, do đó id sẽ lấy giá trị 1 khi truy vấn được thực
hiện.
DELETE FROM todos WHERE id = 1
Lưu ý rằng, nếu bạn có nhiều phần giữ chỗ, bạn cần truyền một mảng tới truy vấn để chuyển dữ liệu đến câu lệnh SQL.
Để lấy được số hàng được xóa, bạn có thể truy cập thuộc tính affectedRows của
Phạm Đình Nam –Trường Caođẳng nghề Đà Lạt Trang 57
Bài 4. Socket 1. Tổng quan về Socket.io
Socket.IO là một thư viện Javascript cho các ứng dụng web realtime (web thời
gian thực).
Nó cho phép giao tiếp hai chiều theo thời gian thực giữa các máy khách và máy
chủ web.
Nó có hai phần client-side library hoạt động trên trình duyệt, và server-side
library cho node.js.