Hiện đang sử dụng: //github.com/felixge/node-mysql
Tôi có mã sau:
var connection = mysql.createConnection[{
host : 'localhost',
user : 'me',
password : 'secret',
database : 'Database1'
}];
app.put['/api/upload', function[req, res, next]
{
connection.connect[];
doMultipleQueries[function[err]
{
connection.end[];
}];
};
Yêu cầu đặt hoạt động hoàn toàn tốt, nhưng gọi nó là lần thứ hai, tôi gặp lỗi sau
events.js:68
throw arguments[1]; // Unhandled 'error' event
^
Error: Cannot enqueue Handshake after invoking quit.
at Protocol._validateEnqueue [/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16]
Tôi có nên để kết nối mở cho đến khi máy chủ chết không?
Cập nhật: Khi tôi di chuyển
events.js:68
throw arguments[1]; // Unhandled 'error' event
^
Error: Cannot enqueue Handshake after invoking quit.
at Protocol._validateEnqueue [/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16]
4 vào chức năng yêu cầu đặt như vậy:var connection = null;
app.put['/api/upload', function[req, res, next]
{
connection = mysql.createConnection[{
host : 'localhost',
user : 'me',
password : 'secret',
database : 'Database1'
}];
connection.connect[];
doMultipleQueries[function[err]
{
connection.end[];
}];
};
Nó hoạt động tốt. Điều này có nghĩa là
events.js:68
throw arguments[1]; // Unhandled 'error' event
^
Error: Cannot enqueue Handshake after invoking quit.
at Protocol._validateEnqueue [/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16]
5 đóng những gì events.js:68
throw arguments[1]; // Unhandled 'error' event
^
Error: Cannot enqueue Handshake after invoking quit.
at Protocol._validateEnqueue [/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16]
4 đã tạo và không thể kết nối lại?
Ken Ingram
unread,
Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/10/19
đến nút-mysql
Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?
Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:
Tôi tạo kết nối của mình như thế này:
var connection = mysql.createConnection[{
//debug: ['ComQueryPacket'],
host : dataSource.host,
user : dataSource.user,
password: dataSource.password,
database: dataSource.database
}];
Tôi có ba chức năng tạo ra các truy vấn cơ sở dữ liệu.
Hàm chứa truy vấn chọn được xây dựng như thế này:
dbSearch[data]{
var sql = "SELECT * from table where field =? and otherfield=?";
return new Promise[[resolve, reject] => {
connection.query[sql, [data[0], data[1], [error, results, fields] => {
if [error]{
console.log[error];
reject["Database connection error: " + error];
} else {
resolve[results];
}
}];
}];
}
Mã thực thi trong một chức năng khác:
if [dataItem]{
dbSearch[dataItem]
.then[[row] => {
processingfunction[row];
}];
Nếu tôi bỏ kết nối.end [], mã bị treo và luồng dữ liệu được giữ tại mục đầu tiên được xử lý.
Nếu tôi đặt Connection.end [] bên trong hàm, tôi sẽ gặp lỗi này:
Lỗi kết nối cơ sở dữ liệu: Lỗi: Không thể truy vấn enqueue sau khi gọi thoát.
Tôi đặt Connection.end [] làm dòng cuối cùng của mã, mọi thứ đều hoạt động tốt
Vấn đề mặc dù là cho các chức năng cập nhật và chèn:
updateRecord[data]{
var sql = "UPDATE table set field=? where id=?";
return new Promise[[resolve, reject] => {
connection.query[sql, [data[0], data[1], [error, results, fields] => {
if [error]{
console.log[error];
reject["Database connection error: " + error];
} else {
resolve[results];
}
}];
}];
}
inputRecord[data]{
var sql = "INSERT INTO table [field1, field2, field3] VALUES[?,?,?]";
return new Promise[[resolve, reject] => {
connection.query[sql, [data[0], data[1], data[2]], [error, results, fields] => {
if [error]{
console.log[error];
reject["Database connection error: " + error];
} else {
resolve[results];
}
}];
}];
}
Với Connection.end [] trong hàm tôi gặp lỗi này.
Database connection error: Error: Cannot enqueue Query after invoking quit.
[node:40700] UnhandledPromiseRejectionWarning: Database connection error: Error: Cannot enqueue Query after invoking quit.
[node:40700] UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch[]. [rejection id: 1]
[node:40700] [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Dựa trên tài liệu, tôi không có sự rõ ràng về cách xử lý đúng cách đóng kết nối để mã có thể xử lý đúng.
Không chắc tôi đang làm gì sai. Có thể sử dụng một số MentorInng từ một người có kinh nghiệm sử dụng các kết nối để xử lý các khối dữ liệu và cách xử lý đúng cách đóng các kết nối?
Lưu ý: & nbsp; Một vấn đề tương tự xảy ra khi tôi thử gộp kết nối, vì vậy đó không phải là một giải pháp khả thi. A similar problem happens when I try connection pooling, so that was not a workable solution.
Ryan Lee
unread,
Ngày 10 tháng 12 năm 2019, 4:10:59 PM12/10/1912/10/19
đến
- Dữ liệu của bạn bạn đang cố tải lớn như thế nào? Nếu bạn cố gắng tải đến bộ dữ liệu lớn, trình thông dịch Node.js & nbsp; sẽ bị sặc. Bạn sẽ cần sử dụng API phát trực tuyến cho các bộ dữ liệu lớn hơn. Để kiểm tra lý thuyết này, hãy ném giới hạn vào các truy vấn chọn của bạn và xem đó có phải là vấn đề không.
- Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:
sự liên quan
& nbsp; .queryasync ["Chọn * từ blah"] // chức năng này được phơi bày như một phần của lời hứa của Blubird & nbsp;
& nbsp; .each [[hàng] => {& nbsp; // bluebird's mỗi cho phép bạn lặp qua hàng của mình theo thứ tự tuần tự
& nbsp; & nbsp; & nbsp; return kết nối.queryasync ["Chèn vào bộ fubar?", formatedrow] & nbsp; // mà bây giờ bạn có thể hoạt động trên mỗi hàng theo thứ tự
& nbsp; }]
& nbsp; .fally [[] => {
& nbsp; & nbsp; Connection.end []; & nbsp; }];
}];
Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit []process.exit[]
dbSearch[dataItem]
.then[[row] => { //remember this might an array of rows.
return processingfunction[row]; //return a promise here
}].then[[] => {
connection.end[]; //close the connection after you've run all your queries
}];
--Ryan
Tôi đang sử dụng mysqljs để truy cập MySQL với JavaScript.
Tôi muốn chỉ ra rằng quá trình này dường như hoạt động tốt nếu một phần dữ liệu duy nhất. Tôi đang cung cấp cho mã của mình một bộ dữ liệu lớn, để được xử lý theo dòng dưới dạng một lô.
Làm thế nào lớn? Nếu bạn đang nói nhiều dữ liệu, bạn cần truyền phát khi bạn hết bộ nhớ trong luồng JS của mình. & NBSP;
Làm thế nào bạn phát trực tuyến dữ liệu? & Nbsp;
Ken Ingram
unread,
Ngày 10 tháng 12 năm 2019, 7:22:25 PM12/10/1912/10/19
đến
- Dữ liệu của bạn bạn đang cố tải lớn như thế nào? Nếu bạn cố gắng tải đến bộ dữ liệu lớn, trình thông dịch Node.js & nbsp; sẽ bị sặc. Bạn sẽ cần sử dụng API phát trực tuyến cho các bộ dữ liệu lớn hơn. Để kiểm tra lý thuyết này, hãy ném giới hạn vào các truy vấn chọn của bạn và xem đó có phải là vấn đề không.
Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:
At most 50 lines of data need update or insert.
- Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:
sự liên quan
& nbsp; .queryasync ["Chọn * từ blah"] // chức năng này được phơi bày như một phần của lời hứa của Blubird & nbsp;
& nbsp; .each [[hàng] => {& nbsp; // bluebird's mỗi cho phép bạn lặp qua hàng của mình theo thứ tự tuần tự
& nbsp; & nbsp; & nbsp; return kết nối.queryasync ["Chèn vào bộ fubar?", formatedrow] & nbsp; // mà bây giờ bạn có thể hoạt động trên mỗi hàng theo thứ tự
& nbsp; }]
& nbsp; .fally [[] => {
& nbsp; & nbsp; Connection.end []; & nbsp; }];
}];
Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit []
Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit []process.exit[]
dbSearch[dataItem] .then[[row] => { //remember this might an array of rows. return processingfunction[row]; //return a promise here }].then[[] => {
connection.end[]; //close the connection after you've run all your queries }];
--Ryan
Tôi đang sử dụng mysqljs để truy cập MySQL với JavaScript. . Or Ol' Dirty Kenstard
Tôi muốn chỉ ra rằng quá trình này dường như hoạt động tốt nếu một phần dữ liệu duy nhất. Tôi đang cung cấp cho mã của mình một bộ dữ liệu lớn, để được xử lý theo dòng dưới dạng một lô.
Ken Ingram
unread,
Ngày 10 tháng 12 năm 2019, 7:22:25 PM12/10/1912/10/19
đến
- Dữ liệu của bạn bạn đang cố tải lớn như thế nào? Nếu bạn cố gắng tải đến bộ dữ liệu lớn, trình thông dịch Node.js & nbsp; sẽ bị sặc. Bạn sẽ cần sử dụng API phát trực tuyến cho các bộ dữ liệu lớn hơn. Để kiểm tra lý thuyết này, hãy ném giới hạn vào các truy vấn chọn của bạn và xem đó có phải là vấn đề không.
Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:
At most 50 lines of data need update or insert.
- Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:
Các truy vấn là độc lập. Chèn và cập nhật tồn tại trong vũ trụ của riêng họ.
Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit []process.exit[]
dbSearch[dataItem] .then[[row] => { //remember this might an array of rows. return processingfunction[row]; //return a promise here }].then[[] => {
connection.end[]; //close the connection after you've run all your queries }];
--Ryan
Đáng buồn thay, bất kỳ nỗ lực nào để đóng thủ công kết nối kết nối
Xử lý hoàn thành +++++++++++++++++++++++++++++++++++> & NBSP; sự kiện.js: 174 & nbsp; & nbsp; & nbsp; người giao cầu; // không xử lý 'lỗi' sự kiện & nbsp; & nbsp; & nbsp; ^
events.js:174
throw er; // Unhandled 'error'
event
^
Lỗi: Không thể bỏ thuốc sau khi gọi QUIT. & NBSP; & nbsp; tại giao thức._ValidateEnqueue [Project \ Node \ node_modules \ mysql \ lib \ protucol \ protucol.js: 215: 16] & nbsp; & nbsp; tại giao thức._enqueue [Project \ Node \ node_modules \ mysql \ lib \ protocol \ protucol.js: 138: 13] & nbsp; & nbsp; tại giao thức.quit [Project \ Node \ node_modules \ mysql \ lib \ Protocol \ protucol.js: 91: 23] & nbsp; & nbsp; tại Connection.end [Project \ Node \ node_modules \ mysql \ lib \ Connection.js: 242: 18] & nbsp; & nbsp; Tại CheckRecord.then.Finally [Project \ Node \ Utility.js: 302: 32]
at Protocol._validateEnqueue [project\node\node_modules\mysql\lib\protocol\Protocol.js:215:16]
at Protocol._enqueue [project\node\node_modules\mysql\lib\protocol\Protocol.js:138:13]
at Protocol.quit [project\node\node_modules\mysql\lib\protocol\Protocol.js:91:23]
at Connection.end
[project\node\node_modules\mysql\lib\Connection.js:242:18]
at checkRecord.then.finally [project\node\utilities.js:302:32]
Ken Ingram
unread,
Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/13/19
đến nút-mysql
Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?
Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:
CẬP NHẬT THEDATA SET FIELD = 'Thông tin' trong đó objid = 1234
{Lỗi: nhóm được đóng lại.
Tại pool.getConnection [Project \ Node \ node_modules \ mysql \ lib \ pool.js: 25: 15]
Tại Promise [Project \ Node \ Utility.js: 506: 8]
tại New Promise []
Tại ExecuteQuery [Project \ Node \ Utility.js: 505: 9]
Tại UpdateRecord [Project \ Node \ Utility.js: 479: 9]
Tại ProcessRecord [Project \ Node \ Utility.js: 443: 12]
Tại CheckRecord.Then [Project \ Node \ Utility.js: 301: 12]
Tại Process._TickCallback [Internal/Process/next_tick.js: 68: 7] Mã: 'pool_closes'}
Bể bơi được phát hành.
Bể bơi được phát hành.
Theo lời khuyên của bạn, tôi đã điều chỉnh mã của mình:
checkRecord[data]
.then [[hàng] => {
//console.log[JSON.stringify[row]];
return ProcessRecord [hàng [0], hàng [1], đầu vào];
// for [var i = 0; i {
pool.end[[err]=>{
if [err] ném err;
Console.log ["Bể bơi phát hành."];
Ken Ingram
unread,
Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/13/19
đến nút-mysql
Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?
I'm still not very sophisticated with async programming, and in particular the idiosyncracies of Promises.
Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:
I have to manually kill the script because the pool is still open.
CẬP NHẬT THEDATA SET FIELD = 'Thông tin' trong đó objid = 1234
[it's looping through an array of input data] is itself returning a
promise.
If I end the connection pool any time before the last DML call to the database
completes, the remaining promises will reject due to no connection.
{Lỗi: nhóm được đóng lại.
Ken Ingram
unread,
Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/13/19
đến nút-mysql
Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?
It was purely how I was returning and handling the promises.
Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:
needed to use Promise.all to collect all of the promises and when they
were all fulfilled, or one was rejected, handle pool.end[];