Công nghệ lập trình Node JS - Công nghệ thông tin | Trường Đại học Quy Nhơn

Công nghệ lập trình Node JS - Công nghệ thông tin | Trường Đại học Quy Nhơn được sưu tầm và soạn thảo dưới dạng file PDF để gửi tới các bạn sinh viên cùng tham khảo, ôn tập đầy đủ kiến thức, chuẩn bị cho các buổi học thật tốt. Mời bạn đọc đón xem!

CÔNG NGHỆ LẬP TRÌNH -
NodeJS Bài 1 – Giới thiệu vê NodeJS.
Để làm việc tốt với NodeJS chúng ta phải được trang bị kiến thức căn
bản về JavaScript.
NodeJS một môi trường thực thi các code JavaScript được triển khai
ngay trên nền hệ điều hành máy tính (Windows, Linux, Mac) chúng ta
đang sử dụng, thay được nhúng trong một trình duyệt web nhiều tính
năng truy xuất hệ thống bị giới hạn. Với NodeJS thì chúng ta có thể viết
code JavaScript cho phép tạo ra các phần mềm khả năng sử dụng
những công cụ, tài nguyên mà hệ điều hành có thể cung cấp:
Tạo, lưu trữ, chỉnh sửa, và xóa các tệp dữ liệu trên máy tính.
Tương tác với các phần mềm khác trong cùng máy tính, dụ như
chương trình quản sở dữ liệu, chương trình cửa sổ dòng lệnh,
hoặc bất cphần mềm nào khác cung cấp giao diện lập trình cho
phép gửi/nhận yêu cầu tương tác.
Tương tác với các thiết bị trong cùng mạng máy tính, và cả những thiết
bị khác qua mạng Internet.
Điều khiển các thiết bị phần cứng như webcam, bàn phím, chuột máy
tính, các thiết bị ngoại vi khác cung cấp giao diện lập trình hỗ
trợ.
Với mục đích giới thiệu đến các bạn công nghệ lập trình hiện tại
đang sử dụng đặc biệt tự động hóa công việc tạo ra các trang web
đơn giao diện tương đồng, hay thể hiểu để hoàn thiện công việc
xây dựng một website sau khi chúng ta đã có khả năng xây dựng được các
giao diện web theo ý muốn; Do đó chúng ta sẽ chỉ tập trung vào 3 mục đầu
của các nội dung trên.
Cài đặt NodeJS và chạy câu lệnh JavaScript đầu
tiên Và điểm đến đầu tiên của chúng ta là trang chủ của NodeJS -
NodeJS.org.
1
B
ộ cài đặt NodeJS được đặt ngay ở giao diện trang chủ với 2 lựa
chọn:
LTS - Long Term Support - là phiên bản được hỗ trợ dài hạn về mặt
kỹ thuật và có độ ổn định rất cao. Thường được sử dụng để chạy trên
các server triển khai các trang web dịch vụ.
Current là phiên bản mới nhất của NodeJS có độ ổn định thấp hơn so
với , tuy nhiên lại có những tính năng mới mà không có. LTS LTS
Sau khi tải về tệp cài đặt thực hiện một pha click đúp, chúng ta đang
giao diện cài đặt của NodeJS. Không tùy chỉnh nâng cao nào chúng
ta cần phải quan tâm thời điểm này, vậy nên sẽ chỉ , , và...Next Next
Next, cho đến khi tiến trình cài đặt hoàn tất.
2
Ảnh chụp màn hình cài đặt NodeJS
Sau khi đã thực hiện cài đặt xong. Bạn mở cửa sổ dòng lệnh của hệ điều
hành; Nếu là Windows như mình đang sử dụng trong máy ảo thì có CMD, nếu là
Mac thì Terminal, còn nếu bạn đang không dùng 2 hệ điều hành kia thì
chắc chắn là biết rõ cái cửa sổ dòng lệnh nó nằm ở đâu rồi. Terminal
Bây giờ chúng ta sẽ gõ vào một vài lệnh để kiểm tra như thế này:
node -v
:: k t qu : v16.14.2 ế
npm -v
:: k t qu : 8.5.0ế
3
Sau khi đã chắc chắn quá trình cài đặt thành công không lỗi lầm gì,
chúng ta đã thể chạy câu lệnh JavaScript đầu tiên chúng ta đã từng
chạy trên trình duyệt web. Việc cần làm tạo ra một tệp đặt trênlearn.js
màn hình . Desktop
console. );log(2022
Sau đó ở cửa sổ dòng lệnh, chúng ta cần di chuyển tới thư mục để Desktop
có thể nhìn thấy tệp JavaScript.
cd Desktop
Và chạy câu lệnh JavaScript đầu tiên.
node learn.js
:: k t qu : 2022ế
4
Chúng ta đã có một phần định nghĩa sơ lược về NodeJS và khởi chạy dòng
lệnh đầu tiên để làm tiền đề cho những kiến thức mới dự định xây dựng
website phía trước. Do kiến thức về ngôn ngữ JavaScript của chúng ta
đang được cập nhật tham khảo tài liệu JavaScript; Những dụ trong
Series NodeJS đây sẽ thể sự thay đổi dần về pháp lệnh
JavaScript bản và phương cách xử lý dữ liệu với các hàm mới do ngôn
ngữ JavaScript cung cấp.
5
Bài 2 - Tạo Một Máy Chủ Web cho NodeJS
Máy chủ web
một thiết bị máy tính đó một phần mềm luôn luôn vận hành
chờ đợi yêu cầu được gửi đến từ các trình duyệt web để xử lý và gửi thông
tin phản hồi lại. bây giờ thì chúng ta sẽ tạo ra một phần mềm như vậy
chạy ngay trên chiếc máy tính của bạn. Đầu tiên chúng ta cần copy/paste
một đoạn code dụ từ trang chủ của NodeJS vào một tệp tên
server.js.
/* Creating a server */
const = http require('http');
const = functionhandleRequest (request, response) {
response. , ); setHeader('content-type' 'text/plain'
response.statusCode ; = 200
response. ); end('Hello NodeJS Server !'
};
const = server http.createServer(handleRequest);
/* Start running server */
const = port 3000;
const = hostname '127.0.0.1';
const = functioncallback () {
console. ); log('Server is runing at...'
console. hstname port ); log('http://' + + + ':' + '/'
};
server.listen(port, hostname, callback);
Sau đó tại cửa sổ dòng lệnh, chúng ta chạy tệp để thử xem có server.js
gì được in ra trong console không.
node server.js
:: k t qu : ế
:: 'Server is running at...'
:: 'http://127.0.0.1:3000/'
6
Bây giờ bạn thử dùng trình duyệt web truy xuất tới địa chỉ được in ra
trong cửa sổ dòng lệnh xem. http://127.0.0.1:3000/
Nếu bạn đang một thiết bị khác nữa dụ như điện thoại smartphone,
máy tính bảng, hay một chiếc máy tính khác trong cùng mạng Wi-Fi, hãy
thử dùng thiết bị đó để truy xuất theo đường dẫn:
http://đ a.ch .IP.n i.b .máy.tính.c a.b n:3000/
Như vậy chúng ta đã một chiếc máy chủ web đúng nghĩa rồi phải
không? Bây giờ nếu như bạn đang sử dụng một đường truyền Internet với
một địa chỉ IP mạng cố định, thì bạn còn thể nhờ bạn của bạn truy cập
từ một nơi khác tới với đường dẫn dưới đây để xem của bạn đã hoạtserver
động được chưa. online
http://IP.nhà.m ng.cung.c p.cho.b n/IP.n i.b .c a.b n:3000/
Sau đó bạn có thể thuê một tên miền như kiểu tên-c a-b n.vn và nhờ công ty
phân phối tên miền xử lý giúp thao tác trỏ về địa chỉ trên; Như vậy là đã có
một trang web với chiếc máy chủ web miễn phí rồi. online
Máy chủ web online miễn phí cho ứng dụng NodeJS cỡ mini
Giới thiệu một trang web miễn phí host cho nhu cầu sử dụng đơn giản như
làm blog nhân. đặc biệt trang web này được tạo ra cho những
người đang tự học lập trình NodeJS. - Glitch https://glitch.com/
Glitch hoàn toàn miễn phí với nhu cầu sử dụng đơn giản với tổng thời gian
online của ứng dụng NodeJS bạn đặt tại đó 1000 gi /1 tháng . Vậy
danh sách những công cụ mi n phí để học tập làm việc của chúng ta đã
lại dài
7
thêm một chút nữa rồi. Sau khi đăng ký tài khoản thành viên của Glitch
tạo một dự án thì chúng ta có luôn một trình soạn thảo code . project online
Thanh điều khiển ở phía bên dưới màn hình cũng có phần mở cửa sổ dòng
lệnh nút để mở xem kết quả vận hành của trang webTerminal Preview
mà chúng ta đang xây dựng.
Mặt khác nữa là tên miền của cũng khá đẹp. Như vậy là có khả năngGlitch
bạn sẽ không phải tốn tiền thuê tên miền cho trang blog nhân, chiếc
máy tính của bạn cũng có thể được nghỉ ngơi chứ không phải online 24/24.
Github Pages thực sự cũng rất tuyệt cho nhu cầu blog nhân nhưng phần
mềm ứng dụng phía được cố định chúng ta khôngserver-side Jekyll
thể thay đổi được. Sau khi xây dựng xong một blog đơn giản
8
bằng , rất có thể chúng ta sẽ làm một trang blog khác để tận NodeJS Glitch
dụng hết khả năng của . Github Pages
Những điểm cần quan tâm trong đoạn code server
đầu tiên
Phần code ví dụ mà chúng ta mới copy/paste từ trang chủ của NodeJS
cũng không quá khó hiểu, chúng ta có 2 thao tác chính:
Tạo ra một mô phỏng phần mềm có tên là được gắn object server
kèm một hàm xử lý yêu cầu . handleRequest
Khởi chạy phần mềm bằng cách gọi phương thức server listen với
các giá trị truyền vào tả đường dẫn để truy cập tới trang web;
một hàm gọi lại sẽ được thực thi sau khi phần mềmcallback
server listen khởi động xong - tức là khi phương thức được thực
thi xong.
Phần mềm này đã hoạt động được khi chúng ta gửi yêu cầu tới bằng
cách dùng trình duyệt truy xuất vào địa chỉ http://127.0.0.1:3000/ với vai trò
một người dùng đang muốn xem nội dung của trang web. Việc cần làm
bây giờ chúng ta cần gửi trang chủ chúng ta đã tới choindex.html
người dùng chứ không phải là một dòng thông báo như trong code ví dụ.
Cụ thể hơn sẽ cần tìm hiểu cách làm thế nào để truy xuất nội dung của một
tệp đã được lưu trữ trong chiếc máy chủ của chúng ta. Rồi sau đóindex.html
tiếp tục tìm hiểu cách làm thế nào để gửi nội dung đó theo dạng phản hồi lại
yêu cầu của người dùng.
9
Bài 3 - Gửi Một Tệp HTML Cho Trình
Duyệt Web
Bài này sẽ tìm hiểu cách thức để thực hiện thao tác đọc một tệp dữ
liệu và gửi phản hồi về trình duyệt web khi nhận được yêu cầu truy cập tới
địa chỉ đã khởi tạo. Các tác vụ làm việc với các thư mục và các tệp server
dữ liệu được NodeJS hỗ trợ bằng cách cung cấp cho người viết code một
module chuyên dụng.
Sử dụng một của NodeJS module
Một module object trong NodeJS thường được đóng gói trong một đại
diện, chúng ta thể truy xuất này bằng cách sử dụng hàmobject
require('tên-module') giống như ở dòng code đầu tiên trong đoạn code server.
/* Creating a server */
const = http require('http');
/* ... */
Bên cạnh đó cũng thể sử dụng pháp import/export của
JavaScript để yêu cầu một hay một thành phần của cần sửmodule module
dụng. Tuy nhiên để sử dụng cú pháp mặc định của JavaScript,import/export
chúng ta scần thực hiện một vài thao tác thiết lập không cần thiết tại
thời điểm này. Do đó chúng ta sẽ tiếp tục học cách sử dụng require
exports của NodeJS.
Trong code ví dụ mở đầu thì mà chúng ta đã sử dụng có tênmodule
http. Đây module được thiết kế để cung cấp các công cụ làm việc với giao
thức - được hiểu nôm na giao thức truyềnHTTP - HyperText Transfer Protocol
tải nội dung siêu văn bản; Trong đó thì cụm t siêu văn b n hay HyperText
đây là để chỉ các văn bản . HTML - HyperText Markup Language
Các được môi trường NodeJS cung cấp mặc định đều được module
lập tài liệu tại trang chủ của NodeJS ở đây - Tài liệu về các của module
NodeJS.
10
trong code ví dụ trước đó, hàm đã được sử dụng để yêu cầu require http
thư viện mặc định của môi trường NodeJS. Chúng ta cũng có thể cài đặt
thêm
các được chia sẻ qua lại giữa cộng đồng lập trình viên giống như việcmodule
sử dụng các ở phía . library framework client-side
Làm quen với cấu trúc tài liệu của NodeJS
Trong trang tài liệu, một thanh điều hướng chính phía bên trái
danh sách của tất cả các được cung cấp bởi . Mỗi một module NodeJS module sẽ
thực hiện một nhóm tác vụ nhất định xoay quanh tên gọi của module đó.
Chúng ta đang cần tìm cách để mở xem nội dung của một tệp, nên từ
khóa phù hợp nhất trong danh sách các chúng ta đang thấy module
đây là - . File System Tài liệu về module File System
Tron
g trang tài liệu về một bất kỳ của NodeJS, cấu trúc nội dung chungmodule
chung sẽ là một danh sách các chỉ mục nội dung của Table of contents
11
trang. bên dưới các đoạn viết nội dung chi tiết cho các chỉ mục đã
được liệt kê. Tuy nhiên thì điều quan trọng nhất chúng ta chỉ cần hiểu
được cấu trúc tổng quan của cái . Table of contents
Thông thường thì mỗi sẽ các nhỏ hơn đượcmodule module con
đóng gói thành một vài đại diện. Và mỗi sẽ được dành luônobject module con
cho một phần dụ đại biểu ngay phần đầu tiên của trang tài liệu, chỉ
đứng sau cái . Do đó khi bạn nhìn vào danh sách các chỉTable of contents
mục thì sẽ thấy đầu tiên tên , rồi rẽ nhánh tới các chỉ mục cấp gầnmodule
nhất các dụ đại biểu cho các các chỉ mục tài liệuexample module con
chi tiết của các ; cái của chúng ta đâyAPI module con Table of contents
đang có dạng tổng quan thế này -
+ File system
+ Promise example
+ Callback example
+ Synchronous example
+ Promises API
+ Callback API
+ Synchronous API
Sau khi đã xem qua những cái tên , , module con promise callback
synchronous, chúng ta thể hiểu các tác v làm việc với các thư mục
các tệp được thực hiện bởi thể được thực thi đồng bộ với sựFile system
hỗ trợ của , hoặc được thực thi bất đồng bộ với sự hỗ trợ củaSynchronous API
Callback API Promises API .
Tuy nhiên chúng ta xem qua các ví dụ đại biểu của các example module
con để rõ hơn về chức năng cũng như cách thức hoạt động của các module
này và nên đọc qua phần mở đầu giới thiệu về tổng xem module File system
các lưu ý gì quan trọng trước khi sử dụng.
12
Ở đây chúng ta có hướng dẫn cơ bản cách yêu cầu một để sử dụng module
trong tệp JavaScript mà chúng ta đang làm việc. Dạng cú pháp đang import
được hiển thị là - cú pháp mặc định của JavaScript. Còn nếu bạn click ESM
vào cái công tắc chuyển đổi ở phía bên phải thì sẽ thấy code ví dụ CJS/ESM
trong khung hiển thị đó thay đổi sang cú pháp và sử dụng hàm CJS require
như chúng ta đã dùng trong ví dụ trước đó.
// s d ng các API promises
const = fsPromises require('fs/promises');
// s d ng các API callback và synchronous
const = fs require('fs');
Tiếp tục xem các ví dụ đại biểu cho các ở phía dưới, chúng ta thửmodule con
so sánh code ví dụ của một chút.synchronous callback
const = { unlinkSync } require('fs');
try {
(unlinkSync '/tmp/hello');
console. ); log('successfully deleted /tmp/hello'
}
catch (error) {
// handle the error
}
const = { unlink } require('fs');
13
unlink('/tmp/hello', function(error) {
if throw (error) error;
); });else console. (log 'successfully deleted /tmp/hello'
Đều code để thực hiện một tác vụ nào đó, đang sử dụng tới các hàm
từ khóa chung của unlink File System, dòng code in thông báo xóa
thành công một tệp nào đó. Đúng như cách thức mà chúng ta sử/tmp/hello
dụng các hàm x bình thường , các hàm bất đồng bộsynchronous
asynchronous kèm theo callback.
Chúng ta đặt một tác vụ đọc nội dung của một tệp để chọn ra một
trong số các module con File system của xử tác vụ. Để đọc nội dung của
một tệp bất kỳ thì chắc chắn tác vụ này sẽ tạo ra một quãng thời gian trễ
cho tiến trình vận hành chung của hệ thống. Do đó lẽ Synchronous API
lựa chọn chỉ dành cho một số ít trường hợp khi chúng ta thực sự không thể
làm khác được. Giải pháp đầu tiên chúng ta nên ưu tiên sử dụng sẽ
luôncác phương thức xử lý được thực thi bất đồng bộ asynchronous được
cung cấp bởi . Callback API Promises API
Mở trình soạn thảo code lên để học NodeJS, chúng ta sử dụng cả 2
nhóm API này xem cách viết nào phù hợp với phong cách duy logic
của mình nhất, hoặc kiểu định dạng code nào phù hợp với mình
nhất.
Sử dụng Callback API
Thao tác chúng ta đang cần xử đ c nội dung của một tệp, từ
khóa tương ứng sau khi Google Translate qua tiếng Anh thì nó là . Và trongread
danh sách chỉ mục con của thì chúng ta một số cái nhưCallback API read
sau:
+ fs.read( ... )
+ fs.readdir( ... )
+ fs.readFile( ... )
+ fs.readlink( ... )
+ fs.readv( ... )
fs.readFile đúng với nhu cầu cần xử lý thao tác đã đưa ra và nội dung của
chúng như sau:
14
Chúng ta thấy pháp tổng quan của fs.readFile với các tham số đầu vào
như sau:
path - đường dẫn thư mục của tệp cần đọc.
callback - hàm gọi lại để tiếp nhận và xử lý dữ liệu kết quả hoặc một
object error tả ngoại lệ nếu không đọc được tệp do nào
đó.
[, options] path - các tham số phụ được đặt ở giữa callback,
có thể có hoặc không.
Sau đó thì chúng ta nhìn thấy code dụ để đọc một tệp có đường dẫn
thư mục . đây chúng ta thay pháp bằng /etc/passwd import require()
như đã nói nhé.
const = { readFile } require('fs');
readFile('/etc/passwd', function(error, data) {
if throw (error) error;
else console.log(data);
});
Hàm sẽ thực hiện thao tác đọc nội dung của tệp readFile /etc/passwd
bằng một logic xử lý. Sau khi thực hiện xong thao tác đọc nội dung của tệp
đó thì sẽ gọi hàm được truyền vào, để bàn giao kết quảreadFile callback
hoạt động.
15
Lúc này công việc tiếp theo được định nghĩa trong hàm để xửcallback
lý kết quả nhận được. Nếu có một được trả về thì sẽ throw luônobject Error
object tả ngoại lệ đó. Trong trường hợp không được trảobject Error
về thì nghĩa thao tác đọc nội dung của đã thành công readFile
dữ liệu được trả vào tham số để in ra . data console
Chúng ta sẽ thực hiện đoạn code này: Đầu tiên chúng ta s cần
chuẩn bị một tệp để làm đối tượng hàm sẽ tìm đếnindex.html readFile
đọc nội dung. Về đường dẫn thư mục thì chúng ta sẽ bắt đầu quy ước từ
bây giờ để làm điểm khởi đầu cho các bài viết tiếp theo nữa. Chúng ta sẽ
một thư mục tổng là nodejs-blog với cấu trúc các thư mục con và các tệp
bên trong khởi đầu như thế này -
[nodejs-blog]
|
+---[static]
| |
| +---[asset]
| | |
| | +---style.css
| | +---main.js
| |
| +---[post]
| | |
| | +---an-article.html
| | +---another-article.html
| |
| +---index.html
| +---oops.html
|
+---server.js
+---test.js
16
Chún
g ta sẽ khởi đầu với tệp có nội dung đơn giản thôi, một cái tiêu đềindex.html
là được.
<!doctype html>
<html > lang="en"
<head>
<meta > charset="UTF-8"
<meta > http-equiv="X-UA-Compatible" content="IE=edge"
<meta name="viewport" ="width=device-width, initial content
scale=1.0">
<title> </title> Homepage
<link > rel="stylesheet" href="/asset/style.css"
</head>
<body>
<h1> </h1> Hello NodeJS !
<script ></script> src="/asset/main.js"
</body>
</html>
Trong tệp chúng ta sẽ code của trong ví dụ test.js copy/paste server.js
ở bài trước, đồng thời cả code ví dụ của trong tài liệu copy/paste fs.readFile
17
của NodeJS chỉnh sửa lại một chút để đọc gửi nội dung của tệp
index.html server dạng phản hồi khi nhận được yêu cầu. Lúc này, các thao
tác phản hồi lại yêu cầu sẽ được di chuyển vào bênresponse.doSomething()
trong định nghĩa hàm callback readFile của để thể s dụng được biến
data.
/* Creating a server */
const = http require('http');
const = fs require('fs');
const = functionhandleRequest (request, response) {
/* var path = 'static' + '\\index.html'; */ // windows
var = + path 'static' '/index.html'; // linux + mac
var = functioncallback (error, data) {
if (error) {
throw error;
}
else {
response. , ); setHeader('content-type' 'text/plain'
response.statusCode ; = 200
response. (data); end
}
}; // callback
fs.readFile(path, callback);
}; // handleRequest
const = server http.createServer(handleRequest);
/* Start running server */
const = port 3000;
const = hostname '127.0.0.1';
const = functioncallback () {
console. ); log('Server is running at...'
console. hostname port ); log('http://' + + + ':' + '/'
};
server.listen(port, hostname, callback);
18
Bây giờ thì chúng ta mở cửa sổ dòng lệnh và khởi động thôi. server
cd Desktop/nodejs-blog/
Nhưng lần này là chúng ta sẽ chạy tệp nhé. test.js
node test.js
:: Server is running at...
:: http://127.0.0.1:3000/
node test.js
# Server is running at...
# http://127.0.0.1:3000/
http://127.0.0.1:3000/
Với kết quả nhận được như trên vậy thao tác đọc dữ liệu của hàm
readFile index.html đã hoạt động tốt, toàn bộ nội dung của tệp đã được gửi
cho trình duyệt web khi nhận được yêu cầu. Nhưng chúng ta khôngserver
muốn hiển thị code cho người dùng xem như vậy, họ chỉ cần đọc thông tin
thôi mà.
19
Nguyên nhân phương án xử cho vấn đề trên đó câu lệnh
response content-type thứ 2 có nói về kiểu nội dung gửi trả và đang được thiết
lập để thông báo cho trình duyệt web - nghĩa text/plain đây n i
dung văn b n/d ng thô, không có gì đ c bi t.
đây do trình duyệt web nhận được bao nhiêu chữ cứ cho
hiện đầy đủ hết lên để người dùng xem luôn; Không cả cần ”thông dịch”
qua xem nội dung đó gì. Nếu trình duyệt web nhận được là code HTML
thì chắc chắn sẽ xử khác chúng ta fix lại như sau: Chỗ text/plain
thành . text/html
Lưu ý là phần mềm của chúng ta sẽ được lưu vào bộ nhớ đệmserver
của máy tính để vận hành, những thay đổi trong code chúng ta tạo
ra sẽ không hiệu lực cho đến khi phần mềm được khởi động lại.server
Bây giờ chúng ta cần thao tác nhấn tổ hợp phím để cửa sổ dòngCtrl + C
lệnh dừng lại, và chạy lại lệnh server node test.js để phần mềm khởi động lại
với code mới.
Nh
ư vậy là trình duyệt web đã nhận được thông báo rằng đây là n i dung văn
b n/code HTML và chỉ hiển thị nội dung của thẻ tiêu đề . Như vậy là vấn đềh1
nằm ở hàm xử lý yêu cầu và phản hồi, và chúng ta chưa thể tìm hiểu thêm
về những thứ liên quan vào lúc này. Ít nhất thì chúng ta đã biết là hàm
readFile callback đã hoạt động hoàn toàn ổn với mà chúng ta truyền vào.
Chúng ta sẽ thử thao tác đọc tệp với sự hỗ trợ của .index.html Promises API
20
Sử dụng Promises API
| 1/83

Preview text:

Hello NodeJS !