+6

[NodeJs] Tạo QR Code trong nodeJs với qrcode

Tạo mã QR Code trong nodejs với qrcode

QR Code là gì?

QR Code (Quick Response Code) là dạng mã vạch hai chiều có thể được đọc bởi một máy đọc mã vạch hay smartphone có chức năng quét mã vạch, hay thông qua ứng dụng của bên thứ 3 (zalo, facebook, ...). Mã QR là một biểu tượng hai chiều, nó được phát minh vào năm 1994 bởi công ty Denso Wave (Nhật Bản). Thông tin thêm các bạn có thể xem tại đây

Sử dụng ở đâu?

Tuỳ từng trường hợp mà chúng ta có thể gen qrcode ở backend hoặc frontend

  • Trong trường hợp data cần tạo qr là thông tin cơ bản, không cần validate cũng như không cần thực hiện các biện pháp bảo mật thì có thể cân nhắc sử tạo QR code ở frontend.
  • Trong trường hợp data là thông tin nhạy cảm cần validate hoặc logic để tạo data phức tạp thì nên tạo ở backend để bảo mật thông tin cũng như dễ dàng maintain hơn.

Tạo QR code với qrcode

Cài đặt thư viện qrcode

Đầu tiên chúng ta cần tạo mới một project. Và cài đặt thư viện express trên comand line với lệnh

npm install express --save

Tiếp theo chúng ta sử dụng lệnh sau trên command line để cài đặt thư viện qrcode

npm install qrcode --save

Hoặc bạn có thể cài đặt global với lệnh

npm install -g qrcode

Sử dụng thư viện qrcode

Bạn có thể tạo được một mã QR đơn giản với một vài dòng code như sau

const express = require('express');
const QRCode = require('qrcode');
const app = express();

app.get('/',async(req,res)=>{
    let img='';
    let qr= await QRCode.toDataURL('I am Cuamotcang!');
    console.log(qr);
    img = `<image src= " `+qr+ `" />`
    return res.send(img);
});

app.listen(3000, ()=>{
    console.log("app is running at port 3000")
})

Ví dụ trên mình đang tạo mã QR cho câu 'I am Cuamotcang'. Khi truy cập vào địa chỉ http://localhost:3000/ bạn sẽ thấy kết quả như sau. Bạn có thể lấy điện thoại ra để quét thử nhé! 😉

Ngoài ra thông tin mã QR được in ra trong comand line bởi câu lệnh console.log(qr) ở trên sẽ như thế này:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAACECAYAAABRRIOnAAAAAklEQVR4AewaftIAAAOPSURBVO3BQY4jSQIDQWdA//+ybx/mwFMACUk1Nb00i38w84/DTDnMlMNMOcyUw0w5zJTDTDnMlMNMOcyUw0w5zJTDTDnMlMNMefGmJPwklXck4ZNUbpLwk1TecZgph5lymCkvPkzlk5LwSSo3SXgiCU3lRuWTkvBJh5lymCmHmfLiy5LwhMoTSWgqLQk3KjcqLQlN5R1JeELlmw4z5TBTDjPlxV8mCU2lJaEloam0JPw/OcyUw0w5zJQXfxmVG5WWhBuVloSWhKbyX3aYKYeZcpgpL75M5Scl4ZtUPknlNznMlMNMOcyUFx+WhH+TSktCU2lJuElCU2lJaCo3SfjNDjPlMFMOM+XFm1R+kyTcJOEnqfyXHGbKYaYcZkr8gzckoam0JHySyk0SnlD5piR8kso3HWbKYaYcZkr8gy9KQlNpSbhRaUloKjdJaCo3SXhC5YkkNJWWhKbykw4z5TBTDjPlxb9M5SYJTyShqdwk4R1JuFF5QuUmCTcq7zjMlMNMOcyUFx+WhKZyk4QblSdUbpLQVFoSmspNEt6RhKZyo9KS8EmHmXKYKYeZ8uJNSWgqLQlN5UalJaGp3CShqdwkoam0JNyotCS0JDSVloSWhBuVbzrMlMNMOcyUF7+cSktCU3lC5QmVmyTcqLQkNJWbJNyofNJhphxmymGmvPhlkvBEEprKTRJuVG6S0FRaEloS3qFyk4Sm8o7DTDnMlMNMefHLqNwk4SYJTeVG5SYJTaUloam0JDSVmyQ0lZaEbzrMlMNMOcyUFz8sCU8koancJOGTVJ5Iwk0SnkhCU/mmw0w5zJTDTIl/8B+WhKbSktBUWhI+SeWJJNyo3CShqbzjMFMOM+UwU168KQk/SaWptCQ8odKScKPSknCThKbyjiR802GmHGbKYaa8+DCVT0rCTRKaSkvCTRJuVN6h8oTKEyqfdJgph5lymCkvviwJT6h8ksoTKi0JTyThHUloKj/pMFMOM+UwU178ZZLQVG5UblSeSMKNSkvCEyotCU3lHYeZcpgph5ny4i+j0pLwhMpNEppKU7lJQlO5SUJT+abDTDnMlMNMefFlKt+kcqPSktBUbpJwk4Sm0pLwDpWfdJgph5lymCkvPiwJPykJTaUl4R0qTyShqbQkPJGEn3SYKYeZcpgp8Q9m/nGYKYeZcpgph5lymCmHmXKYKYeZcpgph5lymCmHmXKYKYeZcpgp/wPa0IYoBgikYgAAAABJRU5ErkJggg==


Ngoài dạng Data URI ra thì qrcode còn hỗ trợ tạo mã qrcode với các dạng khác nhau như: String (toString), canvas (toCanvas), file (toFile), file stream (toFileStream). Sau đây là ví dụ tạo mã QR dưới dạng file:

app.get('/',async(req,res)=>{
    await QRCode.toDataURL('cmc.png', 'I am Cuamotcang!');
    return res.send('hello');
});

Và đây là kết quả thu được truy cập http://localhost:3000/. Một file hình mới có tên cmc.png đã được tạo

qrcode option

qrcode hỗ trợ 4 kiểu ký tự đầu vào khác nhau, và với mỗi loại thì sẽ tương ứng với số ký tự tối đa có thể mã hóa được.

Kiểu dữ liệu Loại ký tự Khả năng mã hóa
Số đơn thuần 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Tối đa 7.089 ký tự
Số và chữ 0–9, A–Z (upper-case only), space, $, % , +, -, ... Tối đa 4.296 ký tự
Số nhị phân (8bit) Ký tự từ bộ JIS X 0208 Tối đa 2.953 byte
Kanji/Kana Ký tự từ bộ ISO/IEC 8859-1 Tối đa 1.817 ký tự

Ta cũng có thể trộn các kiểu mã hóa lại với nhau như trong ví dụ dưới đây:
app.get('/',async(req,res)=>{
    let img='';
    const segs = [
        { data: 'CUAMOTCANG', mode: 'alphanumeric' },
        { data: '123', mode: 'numeric' }
    ]
    let qr= await QRCode.toDataURL(segs);
    img = `<image src= " `+qr+ `" />`
    return res.send(img);
});

Ngoài ra chúng ta cũng có thể thay đổi màu sắc, kích thước, đuôi file, ... của mã QR được tạo ra. Chi tiết xem tại đây. Dưới đây là một ví dụ minh họa:

app.get('/',async(req,res)=>{
    let img='';
    const segs = [
        { data: 'CUAMOTCANG', mode: 'alphanumeric' },
        { data: '123', mode: 'numeric' }
    ]
    let qr= await QRCode.toDataURL(segs, {
        color: {
            dark: '#00F',
            light: '#0000'
        },
        width: 300,
        margin:10,
        scale: 10
    });
    img = `<image src= " `+qr+ `" />`
    return res.send(img);
});

Lời kết

Đây là bài viết đầu tay của mình, hy vọng mọi người thích bài viết này. Trong bài viết còn có nhiều thiếu sót. Mong mọi người góp ý thêm ạ. Cám ơn mọi người đã đọc bài viết này. 😀

Tham khảo

https://www.npmjs.com/package/qrcode

https://vi.wikipedia.org/wiki/Mã_QR

https://aidcvn.com/ma-qr-code-la-gi.html


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí