Phần 1: Tìm hiểu về FeatherJS - Tạo ứng dụng chat realtime

Ngày 28 tháng 12 năm 2018 | 94 views

Chào các bạn,

Ngày rộng tháng dài nhoằng cái đã cuối năm 2018 rồi. Hôm nay là ngày cuối cùng làm việc trong năm 2018 lại cũng rảnh rảnh nên viết bài chơi.

Nghĩ đi nghĩ lại chẳng biết viết gì thôi thì viết về NodeJS vậy. :D Hôm nay mình sẽ chia sẻ về một framework rất hay của NodeJS để giúp các bạn viết rất nhanh các API REST và SocketIO. Bài viết sẽ được chia làm các phần nhỏ như sau cho đỡ dài nhé!

- Phần 1: Tìm hiểu về FeatherJS và các thành phần của nó

- Phần 2: Xây dựng backend với FeatherJS

- Phần 3: Xây dựng frontend với Angular 2

Let's go!

Phần 1: Tìm hiểu về FeatherJS và các thành phần của nó

Để định nghĩa FeathersJS có phải là 1 framework hay chỉ là 1 thư viện thì ngay trang chủ của nó cũng không nói tới, nó chỉ định nghĩa như sau:

"Feathers is a batteries included but entirely optional minimal web application framework." nên có thể hiểu nó là một thư viện nhưng có những thứ tối thiểu của một web application framework nhé. :D

Đầu tiên để cài đặt FeathersJS chỉ cần chạy lệnh

npm install @feathersjs/feathers --save

Để add featherjs vào trong project nodejs của bạn

const feathers = require('@feathersjs/feathers');
const app = feathers();

Ví dụ: Sau khi cài đặt bạn tạo file app.js

const feathers = require('@feathersjs/feathers');
const app = feathers();

// Register a simple todo service that returns the name and some text
app.use('todos', {
  async get(name) {
    // Return an object in the form of { name, text }
    return {
      name,
      text: `You have to do ${name}`
    };
  }
});

// A function that gets and logs a todo from the service
async function getTodo(name) {
  // Get the service we registered above
  const service = app.service('todos');
  // Call the `get` method with a name
  const todo = await service.get(name);

  // Log the todo we got back
  console.log(todo);
}

getTodo('dishes');

Chạy file app.js để xem thành quả nhé!

node app.js

Giải thích: Đoạn code trên sẽ đăng ký và tạo ra 1 service tên là todos với 2 field là name và text. Rất dễ hiểu đúng không! :D

Serivce trong FeatherJS

Về cơ bản FeatherJS xoay quanh 1 thứ trung tâm là Service. Tất nhiên phải có Service mới có API để call rồi. Service là trái tim của FeatherJS, các service cung cấp các giao diện độc lập để tương tác với các cơ sở dự liệu nào đó mà phía gọi và sử dụng nó không cần quan tâm.

Các method của Service:
- find: Tìm kiếm tất cả các dữ liệu
- get: Lấy về dữ liệu bằng một trường định danh duy nhất của nó
- create: Tạo dữ liệu mới
- update: Cập nhật dữ liệu
- patch: Cập nhật một hay nhiều bản ghi bằng cách merge với dữ liệu cũ
- remove: Xóa dữ liệu

Chúng ta có thể định nghĩa Service theo 2 cách: Object hoặc Class

// Object
const myService = {
  async find(params) {
    return [];
  },
  async get(id, params) {},
  async create(data, params) {},
  async update(id, data, params) {},
  async patch(id, data, params) {},
  async remove(id, params) {}
}

app.use('/my-service', myService);

// Class
class myService {
  async find(params) {
    return [];
  }
  async get(id, params) {}
  async create(data, params) {}
  async update(id, data, params) {}
  async patch(id, data, params) {}
  async remove(id, params) {}
}

app.use('/my-service', new myService());

Trong đó:

- id: Mã định danh duy nhất cho dữ liệu

- data: Dữ liệu được gửi bởi người dùng

- params: Tham số bổ sung

Khi đăng ký một service nó sẽ trở thành một NodeJS EventEmitter và nó sẽ gửi events với dữ liệu mới khi một method được gọi. Chúng ta có các method và các event tương ứng như sau:

Service method Service event
service.create() service.on('created')
service.update() service.on('updated')
service.patch() service.on('patched')
service.remove() service.on('removed')

Hooks

Có một thứ nữa cần quan tâm trong feathersjs đó là Hooks. Hooks là các functions được gọi trước hoặc sau các service method hoặc trong trường hợp có lỗi xảy ra khi tương tác với service đó. Sau khi generate service, feathers cung cấp 1 module để ta khai báo hook với service đó, tương tự với service task của chúng ta. Đại loại nó sẽ quản lý vòng đời của các service và thực hiện một việc gì đó trước hoặc sau khi service được gọi.

module.exports = {
  before: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },

  after: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },

  error: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  }
};

Ví dụ:

app.service('messages').hooks({
  before: {
    create (context) {
      context.data.createdAt = new Date();

      return context;
    }
  }
})

Tuy nhiên thường thì người ta sẽ viết hooks theo dạng function:

// Trước khi tạo và cập nhật messages hàm setTimestamp sẽ được gọi
const setTimestamp = name => {
  return async context => {
    context.data[name] = new Date();

    return context;
  }
} 

app.service('messages').hooks({
  before: {
    create: setTimestamp('createdAt'),
    update: setTimestamp('updatedAt')
  }
});

Hook context là một đối tượng chứa thông tin về phương thức dịch vụ, dữ liệu...Nó chỉ có thể đọc và ghi (không thể sửa đổi).

- Thuộc tính chỉ đọc:

  • context.app - Đối tượng của Feathers application
  • context.service - The service this hook is currently running on
  • context.path - The path of the service
  • context.method - The service method
  • context.type - The hook type (beforeafter or error)

- Thuộc tính có khả năng ghi:

  • context.params - Phương thức gọi các thuộc tính. Các thuộc tính thường bao gồm:
    -   context.params.query - Truy vấn khi gọi service
    - context.params.provider - Tên của các chuẩn ví dụ như REST, Socket, Primus...
  • context.id -  id của các phương thức của service như getremoveupdate và patch
  • context.data - Dữ liệu được gửi bởi người dùng trong các lời gọi createupdate và patch
  • context.error - Lỗi được trả về khi gọi các phương thức của service
  • context.result - Kết quả trả về của các phương thức của service ( after hooks)

Vậy nhé các bạn. Phần tiếp theo mình sẽ chia sẻ viết các API để làm ứng dụng Chat đơn giản. 

Phần 3: Xây dựng frontend với Angular 6

Ngày 03 tháng 1 năm 2019

03-01-2019
61
Phần 2: Xây dựng backend với FeatherJS

Ngày 28 tháng 12 năm 2018

28-12-2018
117
Tìm hiểu về Node Js cơ bản

Ngày 03 tháng 9 năm 2017

03-09-2017
281