Sử dụng cookies

Một phần của tài liệu Giáo trình môn học phát triển mã nguồn mở với NodeJS (ngànhnghề thiết kế trang web) (Trang 46)

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.

Một phần của tài liệu Giáo trình môn học phát triển mã nguồn mở với NodeJS (ngànhnghề thiết kế trang web) (Trang 46)

Tải bản đầy đủ (PDF)

(72 trang)