Tôi có một nút. js/Express ứng dụng truy vấn MySQL db trong route và hiển thị kết quả cho người dùng. Vấn đề của tôi là làm cách nào để chạy truy vấn và chặn cho đến khi cả hai truy vấn được thực hiện trước khi chuyển hướng người dùng đến trang họ yêu cầu?
Trong ví dụ của tôi, tôi có 2 truy vấn cần hoàn thành trước khi kết xuất trang. Tôi có thể chạy đồng bộ các truy vấn nếu tôi lồng truy vấn 2 bên trong lệnh gọi lại 'kết quả' của truy vấn 1. Tuy nhiên, điều này sẽ trở nên rất phức tạp khi số lượng truy vấn tăng lên
Làm cách nào để tôi chạy đồng bộ nhiều truy vấn cơ sở dữ liệu [trong trường hợp này là 2] mà không lồng truy vấn tiếp theo trong hàm gọi lại 'kết quả' của truy vấn trước?
Tôi đã xem 'Điều khiển luồng / Tính năng không đồng bộ' trong các mô-đun Node và đã thử dùng flow-js nhưng tôi không thể làm cho nó hoạt động với các truy vấn không đồng bộ
Dưới đây là 2 truy vấn mà tôi đang cố gắng thực hiện từ tuyến đường '/home'. Các chuyên gia Node có thể giải thích cách 'đúng' để thực hiện việc này không
Nút. js là I/O không đồng bộ mà các quy trình khác có thể bắt đầu và không phải đợi một số quy trình đầu vào/đầu ra đang chạy lâu như đọc và ghi từ tệp hoặc cơ sở dữ liệu. Ví dụ: bạn đang chạy năm truy vấn trong vòng lặp for, kết quả của mỗi vòng lặp sẽ được thêm vào một mảng. Ngay sau vòng lặp for, bạn đang gọi hàm gọi lại để lấy tất cả kết quả, nhưng rất có thể bạn sẽ nhận được một mảng trống vì dòng sau vòng lặp for được thực thi trước các dòng trong vòng lặp for. Đoạn mã dưới đây trình bày cách đảm bảo tất cả các truy vấn được xử lý trước khi thực hiện chức năng gọi lại. Nó khai báo một biến đếm đang chờ xử lý và đặt nó thành số lượng truy vấn sẽ được chạy. Sau khi truy vấn được thực hiện thành công, hãy giảm độ chờ xử lý xuống 1, gọi hàm gọi lại nếu khi độ chờ xử lý bằng 0
var mysql = require['mysql']; var pool = mysql.createPool[{ host : 'localhost', user : 'root', password: '', database: 'test' }]; function getStudents[ids, cb] { var students = []; var pending = ids.length; for[var i in ids] { pool.query['SELECT * FROM students WHERE id = ?', [ ids[i] ], function[err, stu]{ students.push[stu]; if[ 0 === --pending ] { cb[students]; //callback if all queries are processed } }]; } } var ids = [1,2,3,4,5]; getStudents[ids, function[students]{ console.log[students]; }];
Bảng được sử dụng trong phần trình diễn ở trên
CREATE database `test`; CREATE TABLE `students` [ `id` int[11] NOT NULL, `name` varchar[20] DEFAULT NULL, `grade` int[11] DEFAULT NULL, PRIMARY KEY [`id`] ] ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO `students` [`id`, `name`, `grade`] VALUES [1,'ken',90], [2,'jim',90], [3,'kay',57], [4,'jerry',57], [5,'wen',66];
Tìm kiếm trong Codexpedia
Tìm kiếm tuỳ chỉnh
Tìm kiếm toàn bộ trang web
Tìm kiếm tuỳ chỉnh
bài viết liên quan
- Tham số chức năng Javascript với nhiều loại đối số khác nhau
- Bản đồ Javascript so với đối tượng
- Sao chép một số thuộc tính từ một đối tượng trong javascript
- Chuyển đổi số cơ sở Javascript
- Thiết lập phaser để phát triển trò chơi html5
- Di chuyển phần tử html lên và xuống khi bạn cuộn trang
- Gửi biểu mẫu html mà không cần tải lại trang
- xác thực mẫu trong nút. js
- Các trường hợp sử dụng JSON
- tài liệu xml so với json
- Hơn
- ← nút. js viết luồng kiểm soát giới hạn song song không đồng bộ của riêng bạn
- Các trường hợp sử dụng JSON →
Trả về một mảng đối tượng từ truy vấn SQL. Truy vấn có thể tùy chọn chứa ?s để được thay thế bằng các giá trị thoát khỏi các giá trị phải là một mảng
sự liên quan. cuộc gọi [tên, đối số]
Gọi một thủ tục cơ sở dữ liệu. Nếu nó chỉ trả về một bộ giá trị, thì bộ giá trị đó được trả về dưới dạng một mảng đối tượng. Nếu nó trả về nhiều bộ giá trị thì chúng được trả về dưới dạng một mảng
truy vấn đồng bộ hóa mysql
17/02/2020
Bởi Siavash Ashkiani
Sự miêu tả
Mở rộng gói mysql tới
1- Quảng cáo đối tượng kết nối cơ sở dữ liệu.
2- Cung cấp phương thức thực hiện truy vấn đồng bộ.
Yêu cầu thiết lập/cài đặt
- Chạy lệnh.
npm install mysql-sync-query
- Khai báo một biến/hằng để yêu cầu gói cài đặt e. g
let db = require["mysql-sync-query"];
- Biến được xác định trong bước cuối cùng đại diện cho một lớp có hàm tạo lấy tên cơ sở dữ liệu hiện có. e. g
let databaseObject = new db["employees_db"];
phương pháp
kết nốiLocal
Kết nối Node với máy chủ MySQL cục bộ hiện có. Thông số
- máy chủ - tên máy chủ e. g. máy chủ cục bộ
- port - cổng kết nối cơ sở dữ liệu e. g. 3306
- người dùng - tên người dùng đăng nhập cơ sở dữ liệu
- mật khẩu - mật khẩu đăng nhập cơ sở dữ liệu
kết nối từ xa
Kết nối Node với máy chủ MySQL từ xa hiện có. Thông số
- URL - e. g.
process.env.JAWSDB_URL
thực hiện kiểm tra
Thực hiện truy vấn đầu vào và trả về các hàng bị ảnh hưởng
Tham số.
- textQuery - chuỗi truy vấn SQL e. g.
"SELECT * FROM table_name"
Trả về. - một đối tượng JSON chứa các bản ghi cơ sở dữ liệu
ngắt kết nối
Chấm dứt kết nối.
Ví dụ
const db = require["mysql-sync-query"];
const dbObj = new db["employees_db"];
async function start[] {
dbObj.connectLocal["localHost", 3306, "user", "password"];
try {
let res = await dbObj.executeQuery["SELECT * FROM employee"];
console.log[res];
}
catch [err] {
console.log[err];
}
finally {
dbObj.disconnect[];
}
}
start[];
lỗi đã biết
Không có - tại thời điểm này
Hỗ trợ và chi tiết liên lạc
Vui lòng gửi email cho chúng tôi nếu có thêm câu hỏi tại ashkiani@yahoo. com
Công nghệ được sử dụng
Nút. js, mysql
Nguyên tắc đóng góp
Liên kết trực tiếp đến gói. https. //www. npmjs. com/gói/mysql-sync-query
Giấy phép
Phần mềm này được cấp phép theo giấy phép MIT