2015-03-30 32 views
6

tôi đang cố gắng sau mã tại js nút sử dụng mysql nhưng nhận được lỗi "Không thể enqueue Query sau gọi bỏ thuốc lá.truy vấn lồng nhau trong js nút sử dụng mysql

var mysql = require('mysql'); 

var connection = mysql.createConnection({ 
host  : 'localhost', 
user  : 'USER', 
password : 'PASS', 
database : 'DB', 
}); 

connection.connect(); 

var queryString = 'SELECT * FROM tbl_product'; 

connection.query(queryString, function(err, rows, fields) { 
    if (err) throw err; 
    for (var i in rows) { 
     console.log('Product Name: ', rows[i].product_name); 
     var emp_query = 'SELECT * FROM tbl_employer'; 
     connection.query(queryString, function(emp_err, emp_rows, emp_fields) { 
      if (emp_err) throw emp_err; 
      for (var e in emp_rows) { 
       console.log('Employer Name: ', emp_rows[e].company_name); 
      } 
     }); 
    } 
}); 
connection.end(); 

Trả lời

3

Hủy bỏ chức năng cuối kết nối

==>connection.end();

1

vấn đề là connection.end() kích hoạt trước khi truy vấn của bạn vẫn chưa kết thúc. cố gắng đưa connection.end() đến cuối vòng ngoài.

connection.query(queryString, function(err, rows, fields) { 
    if (err) throw err; 
    for (var i in rows) { 
     console.log('Product Name: ', rows[i].product_name); 
     var emp_query = 'SELECT * FROM tbl_employer'; 
     connection.query(queryString, function(emp_err, emp_rows, emp_fields) { 
      if (emp_err) throw emp_err; 
      for (var e in emp_rows) { 
       console.log('Employer Name: ', emp_rows[e].company_name); 
      } 
     }); 
    } 
    connection.end(); 
}); 

Hy vọng nó sẽ hữu ích cho bạn.

+0

truy vấn được không đồng bộ vì vậy ngay cả đặt connection.end() sau khi cho vòng lặp không giải quyết được vấn đề – Edo

5

tôi thấy hai vấn đề trong mã của bạn:

  • Bạn đang gọi điện thoại connection.end() đồng bộ, nhưng truy vấn của bạn chạy trong một dòng chảy không đồng bộ. Bạn phải gọi connection.end() chỉ khi bạn đã hoàn thành truy vấn thứ hai.
  • Bạn đang sử dụng một vòng lặp for thường xuyên để chạy các cuộc gọi assynchronous (bạn outter loop).

Để thực hiện những gì bạn đang cố gắng làm, bạn phải xem xét các trường hợp không đồng bộ đó. Bạn có thể sử dụng promises hoặc một module như async, cung cấp cho bạn rất nhiều phương pháp để đối phó với dòng assyncronous, như async.each():

connection.query(queryString, function(err, rows, fields) { 
    if (err) throw err; 

    async.each(rows, function (row, callback) { 
     console.log('Product Name: ', row.product_name); 
     var emp_query = 'SELECT * FROM tbl_employer'; 
     connection.query(queryString, function(emp_err, emp_rows, emp_fields) { 
      if (emp_err) callback(emp_err); 
      for (var e in emp_rows) { 
       console.log('Employer Name: ', emp_rows[e].company_name); 
      } 
      callback(); 
     }); 
    }); 
    }, function (err) { 
     connection.end(); 
    } 
}); 

Bây giờ nó sẽ đảm bảo rằng connection.end() sẽ chỉ được gọi khi tất cả các truy vấn của bạn đã kết thúc.

Các vấn đề liên quan