Nodejs MySQL đồng bộ

Các hàm không đồng bộ là một trong những tính năng quan trọng nhất của JavaScript. Nó cho phép nhiều hoạt động không đồng bộ chạy đồng thời. Viết mã không đồng bộ bằng các hàm gọi lại có thể khó và phức tạp [gây ra sự cố gọi lại địa ngục]. Đó là lý do tại sao lời hứa được giới thiệu để giảm bớt sự phức tạp này. Mặc dù vậy, khi thực hiện nhiều hoạt động không đồng bộ theo trình tự, các lời hứa nên được lồng vào nhau hoặc được tạo thành bằng cách xâu chuỗi nhiều. các phương thức then[]. Để tránh sự cố lồng nhau này và thay thế cho chuỗi, cú pháp async/await được giới thiệu trong ES6 để cho phép khởi tạo nhiều lời hứa và sau đó giải quyết các giá trị khi được yêu cầu trong quá trình thực thi chương trình. Vì vậy, các hàm async cung cấp một cách mới để viết mã dễ đọc hơn và có thể mở rộng hơn để xử lý các lời hứa

Cú pháp kết hợp async/await, được giới thiệu trong nút. js phiên bản 8 và hứa hẹn sẽ viết các truy vấn MySQL trong nút. js dễ dàng hơn với khả năng bảo trì tốt hơn. Mục đích của bài viết này là chỉ cho bạn cách sử dụng tổ hợp này để tương tác với cơ sở dữ liệu MySQL trong nút. js một cách thực tế

Hệ thống ủy quyền và xác thực JWT hoàn chỉnh cho MySQL/Node. API js

Những bài viết liên quan

  • Cách triển khai liên kết Nhiều-Nhiều trong MySQL/Node. js sử dụng async/await
  • Cách triển khai liên kết Một-Một trong MySQL/Node. js sử dụng async/await
  • Cách triển khai liên kết Một-Nhiều trong MySQL/Node. API js
  • Cách sử dụng Sequelize async/await để tương tác với cơ sở dữ liệu MySQL trong Node. js
  • Hệ thống ủy quyền và xác thực JWT hoàn chỉnh cho MySQL/Node. API js
  • Nút. js + MySQL. Thêm Quên/Đặt lại Mật khẩu vào Hệ thống Xác thực Đăng nhập
  • Cách xây dựng API hoàn chỉnh để đăng nhập và xác thực người dùng bằng MySQL và Node. js
  • Cách lưu trữ Phiên trong Cơ sở dữ liệu MySQL bằng express-mysql-session
  • Nodemailer + Gmail. Cách gửi email từ nút. js sử dụng Gmail
  • Nút. js + Nodemailer. Cách gửi Email qua SMTP với Nodemailer
  • Cách nhận Yêu cầu Xuất xứ trong Express. js?
  • Cách nhận Máy chủ yêu cầu nhanh. js?

Bài viết này sẽ đề cập

Tạo nhóm kết nối

Chúng tôi đang sử dụng nhóm kết nối để kết nối cơ sở dữ liệu của mình. Nhóm kết nối có thể quản lý nhiều kết nối sẽ giúp chúng tôi và giảm bớt sự tương tác không đồng bộ với cơ sở dữ liệu. Nếu bạn muốn biết thêm về tổng hợp kết nối và cách thức hoạt động của nó, bạn có thể xem bài viết này. Tại sao Tổng hợp kết nối tốt hơn Kết nối đơn lẻ?

const mysql = require['mysql'];
 
const pool = mysql.createPool[{
    connectionLimit: 10,    
    password: “yourDBpassword”,
    user: “yourusername”,
    database: “yourDBname”,
    host: “locahost”,
    port: “yourDBport”
 
}]; 

Cách sử dụng lời hứa với các truy vấn MySQL

Sử dụng mã không đồng bộ để tương tác với cơ sở dữ liệu MySQL giúp quá trình truy cập dữ liệu trong cơ sở dữ liệu của bạn trở nên tự nhiên và dễ hiểu hơn đối với con người. Điều đó có nghĩa là bạn có thể gửi song song nhiều truy vấn đến cơ sở dữ liệu và trong khi chờ kết quả truy vấn của mình, một số tác vụ đồng bộ có thể được thực thi như tải các phần tử DOM, v.v.

Để tạo một lời hứa, chúng tôi sử dụng từ khóa hàm tạo “mới”. Đối tượng lời hứa có hai tham số, một cho thành công và một cho thất bại. [giải quyết, bác bỏ]. Nó trả về một giá trị với cuộc gọi lại giải quyết và một đối tượng lỗi với từ chối

Lời hứa có ba trạng thái

  • Chưa giải quyết. Đây là trạng thái ban đầu của lời hứa trước khi hoạt động bắt đầu
  • Đã giải quyết hoặc hoàn thành. Các hoạt động đã được hoàn thành
  • Bác bỏ. Hoạt động không thành công và gây ra lỗi

Ví dụ về cách viết truy vấn CHỌN bằng lời hứa

Để viết truy vấn CHỌN chọn tất cả các thành phần từ bảng có tên DB_table trong cơ sở dữ liệu MySQL của bạn, chúng tôi sử dụng hàm mũi tên trả về một đối tượng lời hứa. chúng ta sẽ sử dụng chức năng này sau trong chức năng async như lời hứa được trả lại

Lời hứa sẽ ở chế độ chờ xử lý cho đến khi thực hiện truy vấn. Khi thực hiện truy vấn xong và chúng tôi nhận được các phần tử DB_table, Lời hứa sẽ được giải quyết thành công. Nhưng nếu có lỗi trong câu truy vấn và chúng ta không lấy được dữ liệu thì Promise sẽ ở trạng thái bị từ chối và trả về một đối tượng lỗi

const mysql = require['mysql'];
 
const pool = mysql.createPool[{
    connectionLimit: 10,    
    password: “yourDBpassword”,
    user: “yourusername”,
    database: “yourDBname”,
    host: “locahost”,
    port: “yourDBport”
 
}]; 




SelectAllElements = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['SELECT * FROM DB_table ',  [error, elements]=>{
            if[error]{
                return reject[error];
            }
            return resolve[elements];
        }];
    }];
};

Cách sử dụng lời hứa async/await để tương tác với MySQL trong nút. js

Hàm JavaScript không đồng bộ được tạo bằng từ khóa “async” trước tên hàm hoặc trước [] khi sử dụng hàm mũi tên. Hàm async luôn trả về một lời hứa. Nếu hàm async trả về một giá trị, thì lời hứa này được giải quyết với cùng một giá trị, nhưng nếu hàm async đưa ra lỗi, thì lời hứa sẽ bị từ chối với lỗi được đưa ra dưới dạng giá trị

Điều làm cho các chức năng async trở nên đặc biệt và hữu ích hơn là việc sử dụng từ khóa chờ. Toán tử chờ chỉ khả dụng bên trong chức năng không đồng bộ. Nó được sử dụng để đảm bảo rằng tất cả các lời hứa được trả về trong hàm async đều được đồng bộ hóa và chờ nhau thực hiện

Nút. js là một môi trường không đồng bộ, vì vậy hầu hết các thao tác Nhập/Xuất đều không đồng bộ và được xử lý theo cách không chặn. Điều đó có nghĩa là truy cập cơ sở dữ liệu cũng là một hành động không đồng bộ, cho phép các hoạt động khác thực thi trong khi chờ kết quả truy vấn

GHI CHÚ. trong bài viết này, chúng tôi chỉ cho bạn một ví dụ đơn giản về hàm async/chờ, nhưng bạn nên biết rằng chờ sẽ hữu ích hơn khi bạn phải chạy nhiều truy vấn và chúng phải được tuần tự hóa và thực hiện theo luồng tuần tự

//Example of queries in a sequential flow

queryPromise1 = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['query1',  [error, results]=>{
            if[error]{
                return reject[error];
            }
            return resolve[results];
        }];
    }];
};

queryPromise2 = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['query2',  [error, results]=>{
            if[error]{
                return reject[error];
            }
            return resolve[results];
        }];
    }];
};

queryPromise3 = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['query3',  [error, results]=>{
            if[error]{
                return reject[error];
            }
            return resolve[results];
        }];
    }];
};


async function sequentialQueries [] {

try{
const result1 = await queryPromise1[];
const result2 = await queryPromise2[];
const result3 = await queryPromise3[];

// here you can do something with the three results

} catch[error]{
console.log[error]
}
}

Trong trường hợp bạn muốn thực hiện song song các truy vấn của mình để bạn có thể sử dụng với đang chờ lời hứa được trả về bởi Promise. tất cả [Hứa. all lấy một danh sách các lời hứa theo thứ tự được xác định trước và trả về một lời hứa khác]

//Example of queries in parallel


queryPromise1 = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['query1',  [error, results]=>{
            if[error]{
                return reject[error];
            }
            return resolve[results];
        }];
    }];
};

queryPromise2 = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['query2',  [error, results]=>{
            if[error]{
                return reject[error];
            }
            return resolve[results];
        }];
    }];
};

queryPromise3 = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['query3',  [error, results]=>{
            if[error]{
                return reject[error];
            }
            return resolve[results];
        }];
    }];
};


async function sequentialQueries [] {

const promise1= queryPromise1[];
const promise2= queryPromise2[];
const promise3= queryPromise3[];

const promises =[promise1, promise2, promise3];

try{
const result = await Promise.all[promises];

// you can do something with the result

} catch[error]{
console.log[error]
}
}

Ví dụ viết route GET sử dụng lời hứa async/await

Để viết một route GET, chúng ta định nghĩa hàm gọi lại là một hàm async để cho JavaScript biết chúng ta đang sử dụng hàm async và có thể sử dụng toán tử đợi sau này. Chúng tôi sử dụng toán tử chờ để đảm bảo rằng việc thực thi chương trình sẽ đợi cho đến khi lời hứa được giải quyết hoặc bị từ chối

Nếu lời hứa được giải quyết, các phần tử DB_table được trả về dưới dạng giá trị lời hứa. Để trích xuất kết quả truy vấn, chúng tôi lưu trữ giá trị lời hứa trong một biến cục bộ có tên là results

Nếu lời hứa bị từ chối, thì một lỗi sẽ được đưa ra. Để bắt lỗi này và xử lý từ chối lời hứa, chúng tôi sử dụng khối try…catch

GHI CHÚ. Trong các chức năng không đồng bộ, khối try…catch hoạt động hoàn hảo và nó được sử dụng để xử lý lỗi được chia sẻ

//apiRouter.js
 
const express =require['express'];
Const apiRouter = express.Router[];

 const mysql = require['mysql'];
 
const pool = mysql.createPool[{
    connectionLimit: 10,    
    password: “yourDBpassword”,
    user: “yourusername”,
    database: “yourDBname”,
    host: “locahost”,
    port: “yourDBport”
 
}]; 

SelectAllElements = [] =>{
    return new Promise[[resolve, reject]=>{
        pool.query['SELECT * FROM DB_table ',  [error, elements]=>{
            if[error]{
                return reject[error];
            }
            return resolve[elements];
        }];
    }];
};


apiRouter.get['/', async [req, res, next]=>{
    try {
        const resultElements = await SelectAllElements[];
        res.status[200].json[{elements: resultElements}]; // send a json response
    } catch[e] {
        console.log[e]; // console log the error so we can see it in the console
        res.sendStatus[500];
    }
}];

Để xem các lời hứa tương ứng CHÈN, CẬP NHẬT và XÓA, hãy nhấp vào Đây. Và vào đây nếu bạn muốn một ví dụ về đăng, đặt và xóa các tuyến đường

để đi xa hơn với các truy vấn của bạn, bạn có thể kiểm tra các bài viết sau

  • Cách triển khai liên kết Nhiều-Nhiều trong MySQL/Node. js sử dụng async/await
  • Cách triển khai liên kết Một-Một trong MySQL/Node. js sử dụng async/await
  • Cách triển khai liên kết Một-Nhiều trong MySQL/Node. API js
  • Hướng dẫn đầy đủ để xây dựng API RESTful với Node. js và Express

    Phần kết luận

    Hy vọng bài viết này hữu ích và giúp bạn hiểu cách sử dụng chức năng async/wait với lời hứa tương tác với cơ sở dữ liệu MySQL của bạn và chỉ cho bạn cách chúng hoạt động cùng nhau

    Để xem triển khai đầy đủ API mà chúng tôi đã sử dụng trong bài viết này để minh họa các ví dụ của chúng tôi về lời hứa async/await tương tác với cơ sở dữ liệu MySQL. Xây dựng API RESTful hoàn chỉnh với nút. js

    Để có một cách dễ dàng và đơn giản để lưu trữ Phiên cấp tốc trong cơ sở dữ liệu MySQL, hãy xem bài viết này. Làm cách nào để lưu trữ Phiên trong Cơ sở dữ liệu MySQL bằng express-mysql-session?

    Chúng ta có thể làm cho nút JS đồng bộ không?

    Đối với lập trình đồng bộ, bạn chỉ cần tập trung vào ngăn xếp cuộc gọi . Đây là phần duy nhất của môi trường NodeJS sẽ hoạt động trong trường hợp này. Ngăn xếp gọi lại là cấu trúc dữ liệu mà bạn sử dụng để theo dõi việc thực hiện tất cả các chức năng sẽ chạy bên trong chương trình.

    MySQL có hỗ trợ không đồng bộ không?

    Bất kỳ máy khách MySQL nào hỗ trợ Giao thức X đều có thể cung cấp khả năng thực thi không đồng bộ , bằng cách sử dụng lệnh gọi lại, Lời hứa hoặc bằng cách chờ đợi một cách rõ ràng một kết quả cụ thể tại thời điểm thực tế .

    MySQL không đồng bộ và đồng bộ là gì?

    Sao chép đồng bộ sẽ đợi cho đến khi tất cả các nút có giao dịch được cam kết trước khi cung cấp phản hồi cho ứng dụng, trái ngược với sao chép không đồng bộ xảy ra trong nền sau khi cam kết với chủ

    Các truy vấn SQL có đồng bộ không?

    các truy vấn SQL thông thường không đồng bộ trong nút. js nhưng nếu bạn muốn chạy đồng bộ thì có thể sử dụng mô-đun này. Trong SQL được đồng bộ hóa, tập kết quả được trả về khi truy vấn được thực thi.

    Chủ Đề