Showing posts with label NodeJS. Show all posts
Showing posts with label NodeJS. Show all posts

August 12, 2016

Xây dựng ứng dụng API với NodeJS - Bảo mật ứng dụng với JWT và Passport

source: https://scotch.io/wp-content/uploads/2014/04/restful-api-node-express-4-router.jpg
Ứng dụng xây xong mà không có bảo mật thì thật sự rất đáng nguy, ứng dụng nào cũng vậy chứ không riêng gì API. Hôm nay có tí chút thời gian, viết thêm bài viết về bảo mật ứng dụng bằng PassportJS và JWT. Để dễ hình dung, mình tóm tắt ngón gọn thế nào là PassportJS cũng như JWT:

Passport là một module trong NodeJS, rất linh động và tích hợp tương tác với nhiều kiểu chứng thực (authenticate) phổ biến như: Basic, Digest, OAuth, OAuth2 và dĩ nhiên là phải có JWT (không có sao có bài viết này được ^^). Còn JWT (Json Web Token) là một kiểu chứng thực (authenticate) đơn giản nhưng cũng an toàn dành cho REST API (rất hợp lý cho loạt bài này).

Rào trước đón sau: "Bài viết không có ý định làm rõ những khái niệm này, chỉ là một ghi chú của bản thân để sau này dễ triển khai." Nên nếu ai đó có sự thắc mắc muốn làm rõ hơn thì bạn nên tự thân vận động để nắm được vấn đề, có vậy bạn mới trở nên cao tay hơn.

July 22, 2016

Xây dựng ứng dụng API với NodeJS - Phần 2.4: CRUD - Delete

source: https://scotch.io/wp-content/uploads/2014/04/restful-api-node-express-4-router.jpg
Đi tiếp cho hết quảng đường CRUD của loạt bài này, để còn đi qua một chặng đường khác đầy hào hứng và hấp dẫn hơn rất nhiều, can đoan luôn. Đây là bài cuối trong phần này, liên can chữ D đó là Delete. Bây giờ chúng ta sẽ thêm một phương thức mới vào service user mà chúng ta đã làm mấy lâu nay:
removeUserById: function (id, cb) {
      User
        .destroy({where: {id: id}})
        .then(function (number) {
          return number ? cb(null, true) : cb(null, false);
        })
        .catch(function (error) {
          return cb(error);
        });
    }

Bây giờ, chúng ta sẽ thêm một router mới đảm nhận vai trò xóa user theo email được cung cấp. Chỉnh sửa tập tin user.js trong thư mục app/controllers theo nội dung như bên dưới:

July 19, 2016

Xây dựng ứng dụng API với NodeJS - Phần 2.3: CRUD - Update

source: https://scotch.io/wp-content/uploads/2014/04/restful-api-node-express-4-router.jpg
Tiếp theo những phần trước, bài này sẽ đi tới phần Update trong CRUD. Để minh họa, mình sẽ viết tiếp phần login vừa rồi, sau khi login sẽ cập nhật thông tin "last_logged_in" chính là ngày hiện hành. Bây giờ chúng ta sẽ sửa lại phương thức login của tập tin user.js trong thư mục app/services như sau:
login: function (email, password, cb) {
      var isSuccessful = true;
      User
        .findOne({
          where: {email: email}
        })
        .then(function (instance) {
          if (!instance) {
            return cb(null, false);
          }
          var user = _.clone(instance.dataValues);
          if (user.password !== password) {
            isSuccessful = false;
            return;
          }
          instance.last_logged_in = sequelize.fn('NOW');
          return instance.save({silent: true});
        })
        .then(function () {
          return cb(null, isSuccessful);
        })
        .catch(function (error) {
          return cb(error);
        });
    }

July 17, 2016

Xây dựng ứng dụng API với NodeJS - Phần 2.2: CRUD - Read

source: https://scotch.io/wp-content/uploads/2014/04/restful-api-node-express-4-router.jpg
Trong phần này, mình sẽ minh họa việc đọc dữ liệu bằng thao tác login. Trong bài này, mình chỉ dùng phương thức findOne() mà được cung cấp sẵn bởi Sequelize nhằm tìm một đối tượng duy nhất. Kết quả trả về chỉ một dòng dữ liệu duy nhất (được phát sinh bởi LIMIT = 1) hoặc là không tìm thấy kết quả nào hết. Đây chỉ là một trong những phương thức lấy dữ liệu mà Sequelize cung cấp, bên cạnh đó có những phương thức khác như: findAll(), findById()

July 14, 2016

Xây dựng ứng dụng API với NodeJS - Phần 2.1: CRUD - Create

source: https://scotch.io/wp-content/uploads/2014/04/restful-api-node-express-4-router.jpg
Ở phần trước, chắc hẳn không ít bạn sẽ (tự) hỏi tại sao không là MongoDB mà là MySQL? MongoDB không phải là thời thượng ah? MySQL già cõi rồi xài chi?...Vô số câu hỏi được đặt ra. Và câu trả lời của mình tại sao loạt bài này dùng MySQL mà không dùng MongoDB

Nói một câu đơn giản, dễ hiểu, xúc tích nhất là: "Mình thích"
Nói một cách cụ thể hơn là: "MongoDB với NodeJS thì nó nhan nhãn hằng ha sa số rồi, thêm 1 bài hay bớt 1 bài cũng không có gì. Một phần nữa MySQL cũng khá thân quen rồi, nên tiếp cận dễ hơn cho đa số người."

July 11, 2016

Xây dựng ứng dụng API với NodeJS - Phần 1: Khởi tạo kiến trúc

Building a RESTful API Node and Express 4
source: https://scotch.io/wp-content/uploads/2014/04/restful-api-node-express-4-router.jpg
Loạt bài này mình sẽ giới thiệu cách tạo một ứng dụng RESTful API dựa trên NodeJS và Express4. Phần đầu này, chỉ là khởi tạo kiến trúc, và lẽ dĩ nhiên, đây không phải là cách duy nhất, nhưng đây là cách quen thuộc mà mình vẫn hay dùng xưa nay. Việc khởi tạo một ứng dụng NodeJS bây giờ có thể gọi là đơn giản nhiều lắm với những công cụ đã được hỗ trợ sẵn.

January 26, 2016

Dễ dàng giả lập HTTP với module Nock trong NodeJS

source: https://cms-assets.tutsplus.com/uploads/users/487/posts/22836/final_image/http-mock-test.png
Theo kế hoạch đặt ra, và phải đẩy thật mạnh blog cho năm nay, nên trước khi Tết Tết cái con Khỉ nó kéo về, làm tinh thần xuống, và sau khi Tết nó qua thì cũng làm tinh thần không nhanh chóng khôi phục, thì làm theo bài blog này, ghi chú lại việc giả lập HTTP trong NodeJS nhằm thực hiện test. (Haiz, số là dạo gần đây bị cái TDD nó đè nên hành xác bu theo đắm đuối)

Mục tiêu và tại sao lại giả lập HTTP, và có tác dụng gì cho việc unit test - TDD. Đơn giản là, hiện tại mình đang viết vài project NodeJS theo cơ chế "thông" nhau bởi API. Unit test vốn dĩ là isolated test, có nghĩa là cô lập nó lại mà test. Nên mình cần giả lập (mock) http response từ API server, rồi tiếp đó mình chỉ tập trung viết code cho client là đủ (không thèm biết API nó mần sao, chỉ cần giả lập những response như nó mô tả là đủ)

January 9, 2016

Sinon - Solved method already wrapped

source: http://cdn.dev.classmethod.jp/wp-content/uploads/2012/03/sinonjs.png
Dạo gần đây do một số nhu cầu nên phải lấn sâu làm việc với mấy anh chàng JS. Từ backend (NodeJS) đến frontend, mà vốn dĩ ưa thích cái phong cách TDD, nên giờ code gì cũng lôi TDD vào mà mần. Đồng đạo có thễ xem lại bài hướng dẫn testing với JS tại đây

Trong lúc mần ăn với TDD JS thì gặp phải tình huống mock một đối tượng và bị báo lỗi "already wrapped". Mần mò một khoảng thời gian, từ google đến stackoverflow rồi thì cũng giải quyết được cái vấn đề này. Hôm nay, có tí thời gian viết bài blog chia sẻ tới mọi người.

November 16, 2015

Testing with mocha and chaijs

Lâu lắm rồi mới ngồi viết một bài kỹ thuật. Hôm nay, mình chia sẻ một chút về cách thực hiện test cho ứng dụng javascript dựa trên Mocha và ChaiJs

Bài viết chỉ mang tính chất ghi lại quá trình mình làm việc với JS và theo định hướng TDD/BDD cho phát triển ứng dụng. Nên sẽ rất căn bản. Và mục tiêu của bài viết cũng chỉ dừng lại ở việc làm sao test được chứ cũng không có gì sâu xa hơn. Bài viết sẽ được đề cập đến Mocha - test framework, ChaiJS - Assertion library