Thứ Năm, 17 tháng 10, 2019

NodeJS

I. CÀI ĐẶT NODE
1. Tài vài cài đặt tại : https://nodejs.org/en/download/
2. Tải và cài git-scm : https://git-scm.com/
3. Kiểm tra trên terminal lệnh: node -v
và npm lệnh: npm -v

II. V8 Engine là gì?
- Máy tính không hiểu ngôn ngữ Javascript
- Javascript Engine dịch Javascript để máy tính hiểu - mã máy (magine code)
- Machine Code là (JavaScript --> C++ --> Asembly Language --> Machine Code)
Vì vậy:
- Node.js được viết trên nền C++
- Trái tim của Node là V8 engine
- V8 chuyển JS thành magine code


III. Hàm cơ bản trong Node.js
1. Tạo file
- Tạo file app.js
- Viết lệnh giống JS
- Chạy lệnh : node app.js trên Terminal
2 Normal Func -- GỌi thoải mái bất cứ đâu trong source
function sayHello(){
    console.log('Hello');
}
sayHello()
3. Function Expression
    sayGo() //  -- TypeError: sayGo is not a function
lỗi sayGo() chưa được khai báo khi gọi


    var sayGo = function(){
        console.log('Go home');
        
    }


4. Hàm expression được thực thi trong hàm Normal
VD
    function callFunc(func){
        func() // Hàm được gọi lại là hàm Expression hoặc 1 hàm Normal
    }
    var hayYo = function(){
        console.log('Hay Yo');
    }
    var biCreate = function(){
        console.log('bibiCreate');
    }
    callFunc(hayYo)
    callFunc(biCreate)
    callFunc(sayHello)


IV. Module và Require


file app.js
// Import 1 module ở 1 file khác dùng hàm require("./đường dẫn")
var dem =  require("./md"

console.log('ABC -- hihi');

console.log(dem(['1',1,2])); // --> gọi và sử dụng hàm dem()
console.log(dem([0,0,0,0,0,0,0,0]));

file md.js

var dem = function(arr){
    return "There are " + arr.length + ' element in Array'
}
// Export cả module dưới dạng hàm
module.exports = dem

V.  Module Patterns  để import nhiều hàm trong 1 file
1. Cách 1












file app.js
// Import 1 module ở 1 file khác dùng hàm require("./đường dẫn")
var test =  require("./pt"

console.log('ABC -- hihi');

console.log(test.demt(['1',1,2])); // --> gọi và sử dụng hàm dem()
console.log(test.tinht(1,2)); // --> gọi và sử dụng hàm tinh()
console.log(test.chaot()); // --> gọi và sử dụng hàm chao()
file pt.js
var dem = function(arr){
    return "There are " + arr.length + ' element in Array'
}
var  tinh = function(a,b){
    return `Sum is ${a+b}`
}
var chao = function(){
    console.log('Hello bibi');
}
// module.exports.(ten muon export) = name function express
module.exports.demt = dem
module.exports.tinht = tinh
module.exports.chaot = chao

2. Cách 2

3. Cách 3

** Hướng đối tượng v2


VI. (sự kiện) on() và emit()  --- Nghe vs Nói
Hàm khởi tạo require('events')
// import modules "events"
// b1. Khởi tạo module trong file bởi  :  require('events')
var sukien = require('events')
// tạo EventEmiter
// b2. Tạo 1 EventEmiter 
var test = new sukien.EventEmitter()
//b4. Tạo hàm Nghe với
// ten_bien.on('key',function(evt){Lam_gi_o_day})
test.on('someKey'function(mgs){ // Nghe
    console.log(mgs);
})
// b3. Tạo key và dữ liệu cho sự kiện nói bởi
// ten_bien.emit('key', data_tranfer)
test.emit('someKey','Hello Mint Mint'// Nói
ví dụ 2:
Khởi tạo  require('util')
// import modules "events"
var sukien = require('events')
var hamchinh = require('util')

// tao Function Express
var Person = function(name){
    this.name = name
}
// inherits(a,b)  : hàm kế thừa của hàm a, b là sự khởi tạo
hamchinh.inherits(Person,sukien.EventEmitter)
var sky = new Person('toan')
var black = new Person('hai')
var deal = new Person('trung')

var people = [sky,black,deal]
people.forEach(function(person){
    person.on('talk'function(msg){
        console.log(person.name + ' Said that: ' +msg);
        
    })
})
sky.emit('talk''Hello')
black.emit('talk''Hello vbbjs')
deal.emit('talk''Hello xbcx')
// console.log(test);
// toan Said that: Hello
// hai Said that: Hello vbbjs
// trung Said that: Hello xbcx

VII. Đọc và Ghi file trong Node.js
Hàm khởi tạo require('fs')
var file = require('fs'// khởi tạo file để Đọc/Ghi
console.log('Bắt đầu');

// Hàm đọc file đồng bộ readFileSync('ten_file',kieu_utf8)
var readfile = file.readFileSync('test.txt','utf8')
console.log(readfile);

// Hàm viết/ghi file đồng bộ writeFileSync('ten_file',noi_dung)
var writeFile = file.writeFileSync('hiihi.js','come on babe')

// Hàm Đọc và Ghi file bất đồng bộ :::
// Cấu trúc readFile(file,type,callback) --> file:ten_file,type:type_data,callback:func được thực hiện sau cùng
var readFileNotSync = file.readFile('test.txt','utf8',function(err,d){
    if(trueconsole.log('dung:' + d); // kết quả này đc thực hiện sau cùng
    else return 'sai'
})
console.log('Kết thúc');
// Bắt đầu
// Hello every one !
// Kết thúc
// dung:Hello every one !

VIII. Tạo/Xóa thư mục Folder/File
var file = require('fs')
// require('fs') : khai báo trình chuẩn bị quản lý file
file.unlink('testWrite.txt'// Lệnh xóa file nào đó cùng cấp unlink.('ten_file')

file.mkdirSync('testC'// -- Tạo 1 folder dùng hàm mkdirSync()

file.rmdirSync('testC'// -- Xóa 1 folder dùng hàm rmdirSync()

file.mkdir('public'function(){ // -- Tạo file public
    file.readFile('test.txt','utf8',function(err,data){ // -- đọc file test.txt
        console.log(err,data);
        file.writeFileSync('./public/results.txt'data// ghi nội dung data vào file results trong thư mục public
    })
})

IX. Hoạt động Server trong NodeJS
1.Phương thức giao tiếp giữa Client và Server
Khách: gửi request lên Server
Server: trả dữ liệu về cho Client


2. Socket . dùng IP của client và server,
Socket gồm nhiều các gói nhỏ để thực hiện các giao thức

3. TCP

3. Port, địa chỉ IP của máy. Lắng nghe các giao thức của Soket

* Socket.io
  • Là một module của NodeJs
  • Được xây dựng nhằm mục đích tạo ra real time NodeJS application. Socket.io cung cấp cho lập trình viên các đặc trưng như event, room và tự động phục hồi lại kết nối.
  • Khi chúng ta include Socket.io module vào trong ứng dụng của mình nó sẽ cung cấp cho chúng ta hai object đó là: socket server quản lý functionality phía server và socket client điều khiển funtionality phía client.
  • Khi client muốn kết nối tới Socket.io server, nó sẽ gửi cho server một “handshake HTTP request”. Server sẽ phân tích request đó với những thông tin cần thiết trong suốt quá trình kết nối. Nó sẽ tìm cấu hình của middleware mà đã được đăng ký với server và thực thi chúng trước khi đưa ra sự kiện kết nối. Khi kết nối thành công thì connection event listener được thực thi, tạo ra một instance mới của socket có thể coi như định danh của client mà mỗi một client kết nối tới sẽ có 1 định danh. Các bạn có thể thấy rõ khi xem hình dưới đây
4. Khởi tạo server đơn giản
Header: cả Client và Server đều cần Header, Header là phần để thêm thông tin mà client ko nhìn thấy


Phần Response Header bao gồm : Content và Status

*** Tạo 1 server Local
Để sử dụng được bất kỳ module nào trong Node.js thì chúng ta cần phải require module đó. Và để require một module trong Node.js chúng ta sử dụng từ khóa require.
 require('http') Khởi tạo module http trong Node


-Bên trong phương thức createServer chứa một phương thức ẩn danh có 2 tham số truyền vào.

  • Tham số thứ nhất: là biến chứa các thông số liên quan đến request mà người dùng gửi lên.
  • Tham số thứ hai là biến chứa các thông số liên quan đến response mà chúng ta muốn trả về client.


var http = require('http'// Khởi tạo module http trong Node
var server = http.createServer(function(req,res){
//thiết lập giá trị server trả về
    res.writeHead(200,{'Content-Type':'text/plain'})
    res.end('Run done!')
}) // Khởi tạo server createServer()
//Khởi tạo server chạy cổng 3333
server.listen(3333,'127.0.0.1')
console.log('chay serrver');

*  Các phương thức và thuộc tính hay dùng trong resquest và response.

- Hàm writeHead() thiết lập kiểu dữ liệu mà server muốn trả về.
// khai báo sử dụng module HTTP var http = require('http'); //Khởi tạo server chạy cổng 8000 http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/html'}); response.write('Hello world'); response.end(); }).listen(8000);
- Hàm write() Hàm này thiết lập nội dung mà server muốn trả về trình duyệt, nội dung này có thể là text có thể là HTML code.
VD: Trả về một trang HTML có thẻ H1 chứa dòng chữ hello world.

// khai báo sử dụng module HTTP var http = require('http'); //Khởi tạo server chạy cổng 8000 http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/html'}); response.write('<html>'); response.write('<head>'); response.write('<title>Hello world </title>'); response.write('</head>'); response.write('<body> <h1>Hello world<h1> </body>'); response.write('</html>'); response.end(); }).listen(8000);
- url :  thuộc tính này chứa các paramter trong URL mà client gửi lên server.
VD:
// khai báo sử dụng module HTTP var http = require('http'); //Khởi tạo server chạy cổng 8000 http.createServer(function (request, response) { var param = request.url; response.write(param); response.end(); }).listen(8000);

Lúc này các tiền tố phía sau domain sẽ được hiện ra nếu có: vd http://localhost:8000/toidicode thì url sẽ là /toidicode.

X. Khái niệm Buffer và Streams
Tưởng tượng lượng data bạn sẽ phải chuyển từ server đến client là 1 núi đường, vậy làm sao để có thể làm công việc này 1 cách nhanh nhất

Chúng ta hãy cắt nhỏ Data đó ra và xếp chúng vào những chiếc xe Buffer đến lúc đầy và chuyển chúng đi nơi khác
// Buffers là không gian lưu trữ tạm những data nhỏ, nó sẽ chuyển đến 1 nơi khác khi nó đầy


VD:

Stream giống nhưng con đường thể hiện luồng đi của những chiếc xe
// Streams là luồng dữ liệu mà data được chuyển đi, stream quản lý luồng data này. 
Làm tăng hiệu xuất chuyển dữ liệu


// Vì vậy Nodejs có thể Realtime

1. Đọc/Ghi dữ liệu bằng Realable
var file = require('fs')
// Hàm createReadStream() Tạo 1 luồng Stream với data là file readMe.txt, định dạng kiểu utf8.
//--> Nếu bỏ encoding sẽ thấy được các Buffer
var docluong = file.createReadStream(__dirname + '/readMe.txt', {encoding:'utf8'})
var ghiluong = file.createWriteStream(__dirname + '/writeMe.txt') // Hàm createWriteStream() để ghi
docluong.on('data'function(chunk){
    console.log('Doc luong nao: ');
    console.log(chunk);
ghiluong.write(chunk); //--> sau khi đọc xong thì ghi
})

2. Khái niệm Pipe
Pipe như khúc cua, đẩy dữ liệu sang ống khác
VD:
var http = require('http')
var file = require('fs')
var server = http.createServer(function(rep,res){
    res.writeHead(200, {'ContentType':'text/plain'}) //--> Đổi thành 'text/html' [Nếu là file html]
    var docluong = file.createReadStream(__dirname + '/readMe.txt','utf8') //--> đổi file nhúng là
index.html
    docluong.pipe(res) // Chuyển dữ liệu sang luồng mới
})
server.listen(8808,'127.0.0.1')
console.log('Server running on port 8808');
Mở port: 127.0.0.1:8808 thì thấy dữ liệu file readMe.txt hiện lên brower

XI. Truyền dữ liệu kiểu JSON
var http = require('http')
var server = http.createServer(function(rep,res){
    res.writeHead(200, {'ContentType':'application/json'}) // định dạng kiểu dữ liệu trả về
 'application/json' viết vào Header
    var obj = {
        name: 'Trương Văn Toàn',
        job: 'developer',
        age: 21,
        home: "Hai Duong"
    }
    res.end(JSON.stringify(obj)) /***/ responsive - trả về đối tượng kiểu JSON
})
server.listen(8808,'127.0.0.1'// server lắng nghe cổng http://127.0.0.1:8808/
console.log('Server running on port 8808');

XII. Điều hướng
var http = require('http')
var file = require('fs')
var server = http.createServer(function (reqres) {
    console.log('nguoi dung yeu cau link: ' + req.url);
    // Giải pháp điều hường link url người dùng
    if (req.url === '/' || req.url === '/home') {
        res.writeHead(200, { 'ContentType': 'application/json' })
        file.createReadStream(__dirname + '/index.html''utf8').pipe(res)
    } else if (req.url === '/login') {
        res.writeHead(200, { 'ContentType': 'text/html' })
        file.createReadStream(__dirname + '/login.html''utf8').pipe(res)
    } else if (req.url === '/api/re') {
        var register = [
            { name: 'bibi'age: 12job: 'gamer' },
            { name: 'chim se'age: 2job: 'gamer' },
            { name: 'z'age: 1job: 'gamer' }
        ]
        res.writeHead(200, { 'ContentType': 'application/json' })
        res.end(JSON.stringify(register))
    } else if (req.url === '/404') {
        res.writeHead(200, { 'ContentType': 'text/html' })
        file.createReadStream(__dirname + '/404.html''utf8').pipe(res)
    }
})
server.listen(8808'127.0.0.1'// server lắng nghe cổng http://127.0.0.1:8808/
console.log('Server running on port 8808');

c








c


c



Không có nhận xét nào:

Đăng nhận xét