Nodejs là gì Viblo

Node.js không chỉ được dùng ở mỗi backend, mà cũng có thể được dùng ở cả frontend, vì vậy, nó đã trở thành một phần rất quan trọng của hệ sinh thái web. Điều này nghĩa là sẽ thật hữu ích cho một nhà phát triển Node.js làm quen với vai trò của công nghệ này cho từng môi trường Javascript khác nhau. Trong bài này, chúng ta sẽ cùng đề cập đến một vài câu hỏi và trả lời cho một vài khía cạnh của Node.js.

Mục lục

  • Node.js là gì?
  • Node phù hợp với gì nhất?
  • npm là gì?
  • Làm thế nào xây dựng ứng dụng Node.js từ ban đầu?
  • npm install dùng để làm gì?
  • Làm thế nào để cài đặt một thư viện vào trong Node.js?
  • Làm thế nào để tạo một script bất kỳ?
  • Có thể tạo một ứng dụng Frontend với Node.js?
  • Bạn có thể chỉ ra 3 framwork phổ biến của Node.js?
  • Express.js hiệu quả với cái gì?
  • Crypto là gì?
  • Chúng ta có thể kiểm soát phạm vi scope toàn cụ và cục bộ trong Node.js như thế nào?
  • Node.js có thể truy cập được file hệ thống hay không?
  • non-blocking nghĩa là gì?
  • Vòng lặp sự kiện là gì và hoạt động như thế nào?
  • Hàm bất đồng bộ có phải chạy song song?
  • Node.js có phải là đa luồng?
  • Module child_process là gì?
  • Sự khác nhau giữa web worker và luồng worker?
  • Ưu điểm khi dùng worker thread với một child process?
  • Bạn có thể tạo một kết nối thời gian thực 2 chiều với client qua HTTP?

Node.js là gì?

Node.js Là môi trường thực thi Javascript được dựa trên V8 engine. Nó cho phép chạy Javascript bên ngoài trình duyệt, cụ thể ở đây là trong một web server.

Node phù hợp với gì nhất?

Node.js phù hợp nhát khi xử lý đa kết nối với độ phức tạp của chu kỳ thấp, dựa vào cơ chế luồng đơn yêu cầu giải phóng các vòng lặp sự kiện ngay khi có thể. Điều đó làm cho Node.js là một sự lựa chọn lý tưởng cho microservices và ứng dụng thời gian thực.

Xem thêm Các framework NodeJS phổ biến

npm là gì?

npmlà viết tắt của Node.js Package Manager. Nó bao gồm một giao diện dòng lệnh cho phép chúng ta truy cập gói đã được đăng ký public và private online.

Làm thế nào xây dựng ứng dụng Node.js từ ban đầu?

Chúng ta có thể bắt đầu bằng việc tạo thư mục project. Sau đó, di chuyển đến folder đó trong dòng lệnh và chạy npm init. Cuối cùng, chúng ta tiếp tục các bước để nhập đủ các thông tin cần thiết.

npm install dùng để làm gì?

Nó sẽ cài đặt các thư viện phụ thuộc trong filepackage.json

Làm thế nào để cài đặt một thư viện vào trong Node.js?

npm install name-of-the-librarysẽ giúp cài đặt thư viện và thêm nó vào như một phụ thuộc dependency. Nếu chúng ta thêm tham số--save-dev, nó sẽ nằm trong devDependency.

Làm thế nào để tạo một script bất kỳ?

Chúng ta đi đến file package.json và thêm script bất trong mục scripts. Sau đó chúng ta chạy script trong terminal và chạynpm run tên-script

Có thể tạo một ứng dụng Frontend với Node.js?

Trình duyệt không thể chạy một ứng dụng Node.js, nhưng bạn có thể sử dụng một vài công cụ như webpack, hay Parcel để đóng gói code và chuyển nó vào trong một công cụ khác để trình duyệt có thể chạy. Hiện nay, khá là phổ biến khi sử dụng môi trường Node.js để xây dựng ứng dụng front-end. Một ví dụ về Node.js được dùng ở frontend đó là Electron framework, nó đã tận dụng sức mạnh của cả Node.js và chromium để tạo ra các ứng dụng native, ví dụ như VS code.

Bạn có thể chỉ ra 3 framwork phổ biến của Node.js?

Express.js có thể là framwork phổ biến nhát hiện nay. Koajs thì có thể là framwork nhanh nhất và Sails.js hoạt động hiệu quả nhất cho các ứng dụng liên lạc thời gian thực 2 chiều có sử dụngsocket.io.

Xem thêm Tạo một Restful API bằng Serverless, NodeJs và Express

Express.js hiệu quả với cái gì?

Express.js làm cho việc tạo routes thật sự dễ dàng với ứng dụng web, nhờ vậy đó là lựa chọn tuyệt vời cho việc tạo REST API. Nó khá là mềm dẻo và dễ dùng, và với kiến trúc trung gian middleware, thì giúp cho hệ thống trở nên đơn giản và dễ dàng mở rộng.

Crypto là gì?

Crypto là một thư viện Node.js cung cấp chức năng mật mã để đáp ứng với các công việc như mã hóa và giải mã mật khẩu.

Chúng ta có thể kiểm soát phạm vi scope toàn cụ và cục bộ trong Node.js như thế nào?

Không giống như Javascript bên phía client, trong Node.js, các biến được đinh nghĩa với var với scope lớn nhất không phải là toàn cục, chúng chỉ là cục bộ và nằm trong module mà chúng được khai báo. Trên trình duyệt, chúng ta có thể truy cập đối tượng window và các biến toàn cục nằm trong đó, và Node.js có một đối tượng cho việc đó gọi là global.

Node.js có thể truy cập được file hệ thống hay không?

Có, chúng ta có thể tận dụng module fs để đọc, ghi, copy và xóa các file và thư mục.

non-blocking nghĩa là gì?

Nó nghĩa là một đoạn code vd như hàm bất đồng bộ, được lập lịch để chạy cho chu kỳ tiếp theo của vòng lặp sự kiện, do đó, cho phép các đoạn code còn lại tiếp tục chạy.

Vòng lặp sự kiện là gì và hoạt động như thế nào?

Vòng lặp sự kiện event loop giúp cho Node.js có khả năng bất đồng bộ. Nó lập lịch thức thi của một tập 5 giai đoạn trong một vòng lặp.

  • Giai đoạn 1 chạy lịch setTimeout và chạy callback setinterval.
  • Giai đoạn 2 sẽ chạy callback IO đã được lập lịch để chạy vào chu kỳ hiện tại.
  • Giai đoạn 3 sẽ quyết định các sự kiện sẽ được thực thi tại chu kỳ tiếp theo.
  • Giai đoạn thứ tư là chạy callback setimmedia[].
  • Và cuối cùng là chạy tất cả callback close.
Xem thêm NPM là gì? Sử dụng NPM như nào?

Hàm bất đồng bộ có phải chạy song song?

Không, một hàm bất đồng bộ sẽ thực thi vòng lặp sư kiện kế tiếp trong khi một tiến trình song song sẽ chạy trong tiến trình hoặc luồng của chính nó

Node.js có phải là đa luồng?

Một tiến trình Node.js chạy trong một luồng đơn, nhưng chúng ta có thể sử dụng modulde child_process để chạy đa tiến trình song song hay trong Worker để chay đa luồng.

Module child_process là gì?

Module child_process cho phép chúng ta tạo và xử lý các tiến trình con. Đó là các tiến trình độc lập chạy trong chính CPU của nó và giúp chúng ta khả năng truy cập vào các câu lệnh hệ thống.

Sự khác nhau giữa web worker và luồng worker?

Web worker được thực hiện trong browser và worker thread được thực hiện trong Node.js. Cả 2 cùng giải quyết chung 1 vấn đề, đó là cung cấp khả năng xử lý song song. Worker thread API dựa trên sự thực thi của web worker.

Ưu điểm khi dùng worker thread với một child process?

Trong khi một tiến trình con chạy trong chính tiến trình của nó với một không gian bộ nhớ của chính nó thì worker thread là một thread nằm trong một tiến trình mà có thể chia sẻ bộ nhớ với thread chính. Điều đó giúp tránh dữ liệu lãng phí.

Bạn có thể tạo một kết nối thời gian thực 2 chiều với client qua HTTP?

Chúng ta có thể sử dụng WebSocket. Có nhiều thư viện nhưsocket.iovà SignalR hỗ trợ việc đơn giản điều đó. Chúng thậm chí cung cấp cho các client khả năng bắt lỗi và thay thế nếu WebSocket không phù hợp với trình duyệt.

Tham khảo: //viblo.asia/

NodeJS là một ngôn ngữ hỗ trợ tạo RESTFULL API đơn giản và hiệu quả. Trong bài này mình sẽ demo cho những bạn chưa từng làm việc với ngôn ngữ Nodejs hoặc đơn giản là muốn tạo một RESTful API với NodeJS

Xin chào mọi người, hôm nay mình muốn demo cho những bạn chưa từng làm việc với ngôn ngữ Nodejs hoặc đơn giản là muốn tạo một RESTful API với NodeJS

REST là gì?

Đầu tiên thì các bạn cần hiểu rõ khái niệm về REST và RESTful là gì phải không?

REST là từ viết tắt của Representational State Transfer. Đó là kiến trúc tiêu chuẩn web và Giao thức HTTP.

Hiểu đơn giản thì các ứng dụng RESTful sử dụng các yêu cầu HTTP để thực hiện bốn hoạt động được gọi là CRUD [C: Create, R: Read, U: Update, và D: Delete].

Để hiểu rõ hơn về khái niệm RESTful các bạn có thể tham khảo bài viết này nhé: Tìm hiểu về RESTful web services

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách tạo một RESTful API bằng cách sử dụng Node.js.

Công cụ:

  • Node.js v7
  • MySQL
  • Trình soạn thảo văn bản hoặc IDE
  • Postman

Bắt đầu

** Giả định**: Máy bạn đã cài đặt NodeJS và MySQL

  • Đầu tiên bạn vào project tạo một tệp package.json - npm init

package.json là một tệp cung cấp thông tin cần thiết cho npm, cho phép nó xác định dự án cũng như xử lý các phụ thuộc của dự án. npm init sẽ nhắc bạn nhập một số thông tin như tên ứng dụng, mô tả, phiên bản, tác giả, từ khóa,.... Khi tạo xong các bạn sẽ có 1 file package.json với nội dung như thế này:

{ "name": "nodejs_api", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
  1. Tạo file server.js ở thư mục root. Trong file này, mình sẽ viết các giao thức để tạo một app mới.

  2. Tạo một thư mục có tên là api Bên trong thư mục này, mình tạo ra folder controllers để chứa các file controller, file routes.js để quản lý các link API và file db.js để kết nối database.

  3. Tạo ProductsController.js trong thư mục api/controllers

Cuối cùng thì project sẽ có cấu trúc như thế này:

Cài đặt server

  1. Ở đây mình dùng 4 package rất hay dùng đó là:
  • express sẽ được sử dụng để tạo máy chủ
  • nodemon sẽ giúp mình theo dõi các thay đổi đối với ứng dụng của mình bằng cách xem các tệp đã thay đổi và tự động khởi động lại máy chủ.
  • dotenv để mình thêm các config cho database[host, port, user, pass, ...] và các config khác
  • mysql để thao tác với database
npm install --save-dev nodemon npm install express --save npm install dotenv --save npm install mysql --save

Khi cài đặt thành công, tệp package.json của bạn sẽ được sửa đổi để có 4 gói mới được cài đặt.

Mở file package.json và thêm script này vào mục scripts: "start": "nodemon server.js"

Như vậy file package.json đã được thay đổi thành:

{ "name": "nodejs_api", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "start": "nodemon server.js" }, "author": "", "license": "ISC", "devDependencies": { "nodemon": "^1.17.5" }, "dependencies": { "express": "^4.16.3", "dotenv": "^5.0.1", "mysql": "^2.15.0" } }
  1. Mở tệp server.js và nhập / sao chép mã bên dưới vào tệp
let express = require['express']; let app = express[]; let port = process.env.PORT || 3000; app.listen[port]; console.log['RESTful API server started on: ' + port];
  1. Trên terminal của bạn, tiếp tục chạy npm run start để bắt đầu máy chủ và sau đó bạn sẽ thấy
RESTful API server started on: 3000

Tạo database

CREATE DATABASE nodejs_api; CREATE TABLE `products` [ `id` int[11] NOT NULL AUTO_INCREMENT, `name` varchar[255] DEFAULT NULL, `color` varchar[255] DEFAULT NULL, `price` decimal[10,0] DEFAULT NULL, PRIMARY KEY [`id`] ] ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; INSERT INTO `products` VALUES ['1', 'Iphone X', 'Black', '30000000']; INSERT INTO `products` VALUES ['2', 'Samsung S9', 'White', '24000000']; INSERT INTO `products` VALUES ['3', 'Oppo F5', 'Red', '7000000'];

Và đây là bảng sau khi chạy sql:

Tạo file kết nối Database

Trước tiên mình cần đưa các config cho database ra file .env Đây là file .env với nội dung:

DB_HOST="localhost" DB_USER="root" DB_PASS="" DB_NAME="nodejs_api

** Lưu ý: ** Các bạn có thể tạo file .env.example để đưa lên git và đưa file .env vào .gitignore

Tiếp đến mình sẽ tạo file db.js:

'use strict'; const mysql = require['mysql']; const db = mysql.createConnection[{ host: process.env.DB_HOST || "localhost", user: process.env.DB_USER || "root", password: process.env.DB_PASSWORD || "", database: process.env.DB_NAME || "nodejs_api" }]; module.exports = db

Như vậy là xong phần config db, khi sử dụng bạn chỉ cần require file db.js vào là có 1 đối tượng db để truy vấn db rồi.

Tạo routes

Dưới đây mình đã tạo hai router cơ bản [/products, và /products/productId] với các phương thức

  • /products có phương thức [GET và POST]
  • /products/productId có 3 phương thức GET , PUT và DELETE. Như bạn có thể thấy, mình đã tạo 2 router và các phương thức để gọi các hàm xử lý tương ứng.

Và đây là nội dung file routes.js:

'use strict'; module.exports = function[app] { let productsCtrl = require['./controllers/ProductsController']; // todoList Routes app.route['/products'] .get[productsCtrl.get] .post[productsCtrl.store]; app.route['/products/:productId'] .get[productsCtrl.detail] .put[productsCtrl.update] .delete[productsCtrl.delete]; };

Tiếp đến mình sẽ tạo file controller và các function tương ứng cho từng routes

Tạo file controller

Trong file ProductsController.js, mình sẽ tạo 5 function có tên: get, detai, update, store, delete và export 5 hàm này để sử dụng trong routes.js.

'use strict' const util = require['util'] const mysql = require['mysql'] const db = require['./../db'] module.exports = { get: [req, res] => { let sql = 'SELECT * FROM products' db.query[sql, [err, response] => { if [err] throw err res.json[response] }] }, detail: [req, res] => { let sql = 'SELECT * FROM products WHERE id = ?' db.query[sql, [req.params.productId], [err, response] => { if [err] throw err res.json[response[0]] }] }, update: [req, res] => { let data = req.body; let productId = req.params.productId; let sql = 'UPDATE products SET ? WHERE id = ?' db.query[sql, [data, productId], [err, response] => { if [err] throw err res.json[{message: 'Update success!'}] }] }, store: [req, res] => { let data = req.body; let sql = 'INSERT INTO products SET ?' db.query[sql, [data], [err, response] => { if [err] throw err res.json[{message: 'Insert success!'}] }] }, delete: [req, res] => { let sql = 'DELETE FROM products WHERE id = ?' db.query[sql, [req.params.productId], [err, response] => { if [err] throw err res.json[{message: 'Delete success!'}] }] } }

Ở đây mình dùng package mysql, để tìm hiểu cách sử dụng chi tiết của package này bạn có thể truy cập vào:

Sắp xếp lại nội dung file server.js

Bên trên, mình đã có một đoạn code ngắn chỉ với mục đích tạo 1 server, sau khi tạo routes, controllers hoàn chỉnh mình sẽ sửa lại file server.js để có thể chạy được app hoàn chỉnh:

Dưới đây là file server.js:

const express = require['express'] const app = express[] const bodyParser = require['body-parser'] require['dotenv'].load[] const port = process.env.PORT || 3000 app.use[bodyParser.urlencoded[{ extended: true }]] app.use[bodyParser.json[]] let routes = require['./api/routes'] //importing route routes[app] app.use[function[req, res] { res.status[404].send[{url: req.originalUrl + ' not found'}] }] app.listen[port] console.log['RESTful API server started on: ' + port]

Mình đã cập nhật thêm

  • body-parser để trích xuất toàn bộ phần nội dung của request đến và hiển thị nó trên đó req.body.
  • load dotenv để sử dụng environment variables
  • import file routes để load tất cả routes đã được khai báo trong file
  • thêm middleware để check nếu request API không tồn tại Dễ hiểu phải không nào??

Kế tiếp để chạy lại server các bạn chạy lệnh:

npm run start

Và console sẽ hiển thị:

RESTful API server started on: 3000

Thực hiện test API trên Postman

  • Get all [method GET]: localhost:3000/products
[ { "id": 1, "name": "Iphone X", "color": "Black", "price": 30000000 }, { "id": 2, "name": "Samsung S9", "color": "White", "price": 24000000 }, { "id": 3, "name": "Oppo F5", "color": "Red", "price": 7000000 } ]
  • Get with id [method GET]: localhost:3000/products/1
{ "id": 1, "name": "Iphone X", "color": "Black", "price": 30000000 }
  • Create [method POST]:localhost:3000/products
{ "message": "Insert success!" }
  • Update [method PUT]: localhost:3000/products/4
{ "message": "Update success!" }

  • Delete [method DELETE]: localhost:3000/products/4
{ "message": "Delete success!" }

OK, như vậy mình đã hướng dẫn xong cách xây dựng 1 RESTful API đơn giản với ngôn ngữ NodeJS, bài viết dựa trên kinh nghiệm của bản thân, nếu có gì sai sót mong các bạn comment để mình sửa nhé ]

Các bạn có thể tham khảo repo github của mình ở đây nhé: //github.com/tienphat/api_nodejs_example

Thanks for reading!

Video liên quan

Chủ Đề