Nodejs mysql chờ truy vấn

async là một trong những mô-đun hữu ích nhất trong nút. js. Đọc thêm về nó ở đây https. //cao lan. github. io/không đồng bộ

Và nếu bạn cụ thể về việc sử dụng vòng lặp for thì hãy thử bản hack nhỏ này

app.get('/next2', function(req, res) {
function callback (s6) {
    cards = s6;
    res.render('step2.ejs', {
        DocumentsNextPage: DocumentsNextPage,
        cards: cards
    });
};

for (i = 0; i < DocumentsNextPage.length; i++) {
    connection.query('SELECT DISTINCT url FROM documents WHERE documents.id = ?; SELECT COUNT(DISTINCT metas.name) AS cnt FROM documents, metas, documents_has_metas WHERE documents.id = documents_has_metas.documents_id AND metas.id_meta = documents_has_metas.metas_id AND documents.id = ?', [DocumentsNextPage[i], DocumentsNextPage[i]], function(err, results) {
        if (err) throw err;
        s6.push(results[0][0].url, results[1][0].cnt);

        if(i==DocumentsNextPage.length-1){
            callback(s6);
        }
    });
};

});

Đây là một nút. trình điều khiển js cho mysql. Nó được viết bằng JavaScript, không yêu cầu biên dịch. Nó cung cấp hầu hết tất cả các kết nối/truy vấn từ MySQL. Node-mysql có lẽ là một trong những mô-đun tốt nhất được sử dụng để làm việc với cơ sở dữ liệu MySQL và mô-đun này được duy trì tích cực

Chúng tôi cho rằng bạn đã cài đặt MySQL và nút. js trên môi trường Windows hoặc Linux

Dưới đây là một ví dụ để truy xuất hàng đầu tiên từ bảng 'nhân viên' thuộc về '' cơ sở dữ liệu

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'datasoft123',
  database : 'hr'
});
connection.connect();

connection.query('SELECT * FROM employees', function(err, rows, fields) 
{
  if (err) throw err;

  console.log(rows[0]);
});

connection.end();

đầu ra

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }

Từ ví dụ trên, bạn có thể tìm hiểu cách tạo kết nối mới và đóng kết nối

nội dung

Cài đặt nút MySQL. trình điều khiển js

$ npm install mysql

Bạn có thể cài đặt phiên bản mới nhất từ ​​Github để kiểm tra xem bản sửa lỗi có hoạt động không. Trong trường hợp này sử dụng lệnh sau

$ npm install felixge/node-mysql

Tạo kết nối

Đây là mã để thiết lập kết nối

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});

Đây là một phương pháp khác để thiết lập kết nối bằng cách gọi một truy vấn

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'datasoft123'
});

connection.query('SELECT 1', function(err, rows) {

if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }
console.log('connected!');
});

Tùy chọn kết nối

NameDescriptionhostTên máy chủ của cơ sở dữ liệu. Mặc định là máy chủ cục bộ. portSố cổng để kết nối với. Mặc định là 3306. localAddressĐịa chỉ IP nguồn để sử dụng cho kết nối TCP. (Tùy chọn)socketPathĐường dẫn đến một socket tên miền unix để kết nối với. Khi máy chủ và cổng được sử dụng bị bỏ qua. userNgười dùng MySQL để xác thực là. password Mật ​​khẩu của người dùng MySQL đó. cơ sở dữ liệuTên của cơ sở dữ liệu sẽ sử dụng cho kết nối này (Tùy chọn). bộ ký tự Bộ ký tự cho kết nối. Điều này được gọi là "đối chiếu" ở cấp độ SQL của MySQL (như utf8_General_ci). Nếu một bộ ký tự cấp SQL được chỉ định (như utf8mb4) thì đối chiếu mặc định cho bộ ký tự đó được sử dụng. (Mặc định. 'UTF8_GENERAL_CI')múi giờMúi giờ được sử dụng để lưu trữ ngày địa phương. Mặc định là. 'địa phương'. connectTimeoutMili giây trước khi hết thời gian chờ trong quá trình kết nối ban đầu với máy chủ MySQL. (Mặc định. 10 giây)stringifyObjectsStringify đối tượng thay vì chuyển đổi thành giá trị. Xem vấn đề #501. (Mặc định. 'false')insecureAuthCho phép kết nối với các phiên bản MySQL yêu cầu phương thức xác thực cũ (không an toàn). (Mặc định. false)typeCast Xác định xem các giá trị cột có được chuyển đổi thành các loại JavaScript gốc hay không. (Mặc định. true)queryFormatMột hàm định dạng truy vấn tùy chỉnh. Xem Định dạng tùy chỉnh. supportBigNumbersKhi xử lý các số lớn (cột LỚN và DECIMAL) trong cơ sở dữ liệu, bạn nên bật tùy chọn này (Mặc định. sai). bigNumberStringsBật cả supportBigNumbers và bigNumberStrings buộc các số lớn (cột BIGINT và DECIMAL) luôn được trả về dưới dạng đối tượng Chuỗi JavaScript (Mặc định. sai).
Bật supportBigNumbers nhưng tắt bigNumberStrings sẽ chỉ trả về các số lớn dưới dạng đối tượng Chuỗi khi chúng không thể được biểu diễn chính xác bằng các đối tượng Số JavaScript (xảy ra khi chúng vượt quá [-2^53, +2^53 . Tùy chọn này bị bỏ qua nếu supportBigNumbers bị tắt. dateStringsBuộc các loại ngày (TIMESTAMP, DATETIME, DATE) được trả về dưới dạng chuỗi thay vì sau đó được thổi phồng thành các đối tượng Ngày của JavaScript. (Mặc định. false)debugIn chi tiết giao thức tới thiết bị xuất chuẩn. (Mặc định. false)traceTạo dấu vết ngăn xếp trên Lỗi để bao gồm trang gọi của lối vào thư viện ("dấu vết ngăn xếp dài"). Hình phạt hiệu suất nhẹ cho hầu hết các cuộc gọi. Mặc định là đúng. multipleStatementsCho phép nhiều câu lệnh mysql cho mỗi truy vấn. Hãy cẩn thận với điều này, nó sẽ khiến bạn bị tấn công SQL injection. (Mặc định. false)flagsDanh sách các cờ kết nối để sử dụng ngoài các cờ mặc định. Cũng có thể đưa vào danh sách đen những cái mặc định. Để biết thêm thông tin, hãy kiểm tra Cờ kết nối. sslobject với các tham số ssl hoặc một chuỗi chứa tên của hồ sơ ssl. Xem các tùy chọn SSL.

Ghi chú. Các giá trị truy vấn trước tiên được cố gắng phân tích cú pháp dưới dạng JSON và nếu điều đó không được coi là các chuỗi văn bản gốc

Chấm dứt kết nối

Có hai cách để kết thúc kết nối

  • phương thức kết thúc()
  • phương thức phá hủy ()

Bạn có thể ngắt kết nối bằng cách gọi phương thức end()


connection.end(function(err) {
  // The connection is terminated now
});

Điều này sẽ đảm bảo rằng tất cả các truy vấn được xử lý trước đó vẫn còn trước khi gửi gói COM_QUIT đến máy chủ MySQL. Nếu một lỗi nghiêm trọng xảy ra trước khi gói COM_QUIT có thể được gửi đi, một đối số err sẽ được cung cấp cho cuộc gọi lại, nhưng kết nối sẽ bị chấm dứt bất kể điều đó

phương thức phá hủy ()

Phương pháp này chấm dứt một kết nối ngay lập tức. Ngoài ra, hủy () đảm bảo rằng sẽ không có thêm sự kiện hoặc cuộc gọi lại nào được kích hoạt cho kết nối

________số 8

Không giống như end(), phương thức hủy() không nhận đối số gọi lại

Chuyển đổi người dùng/thay đổi trạng thái kết nối

MySQL cung cấp lệnh changeUser cho phép bạn thay đổi người dùng hiện tại và các khía cạnh khác của kết nối mà không cần tắt ổ cắm bên dưới


connection.changeUser({user : 'user2'}, function(err) {
  if (err) throw err;
});

Các tùy chọn có sẵn

NameDescriptionuserTên của người dùng mới (mặc định là tên trước đó). passwordMật khẩu của người dùng mới (mặc định là mật khẩu trước đó). bộ ký tự Bộ ký tự mới (mặc định là bộ ký tự trước đó). cơ sở dữ liệu Cơ sở dữ liệu mới (mặc định là cơ sở dữ liệu trước đó)

Một tác dụng phụ đôi khi hữu ích của chức năng này là chức năng này cũng đặt lại bất kỳ trạng thái kết nối nào (biến, giao dịch, v.v. )

Các lỗi gặp phải trong quá trình vận hành này được mô-đun này coi là lỗi kết nối nghiêm trọng

xử lý lỗi

Có một số tùy chọn để xử lý lỗi trong mô-đun này

Tất cả các lỗi được tạo bởi mô-đun này là các phiên bản của đối tượng Lỗi JavaScript. Ngoài ra, chúng có hai thuộc tính

  • sai lầm. mã số
    • Một lỗi máy chủ MySQL (e. g. 'ER_ACCESS_DENIED_ERROR')
    • một nút. lỗi js (e. g. 'SỬ DỤNG KINH TẾ')
    • Một lỗi nội bộ (e. g. 'PROTOCOL_CONNECTION_LOST')
  • sai lầm. gây tử vong. Boolean, cho biết liệu lỗi này có phải là thiết bị đầu cuối của đối tượng kết nối hay không

Các lỗi nghiêm trọng được lan truyền (làm nhân lên bởi bất kỳ quy trình nào) cho tất cả các cuộc gọi lại đang chờ xử lý. Trong ví dụ bên dưới, một lỗi nghiêm trọng được kích hoạt bằng cách cố gắng nhập tên người dùng không hợp lệ. Do đó, trong ví dụ sau, đối tượng lỗi được truyền đến cả hai cuộc gọi lại đang chờ xử lý

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'datasoft123',
  database : 'hr'
});
connection.connect();

connection.query('SELECT * FROM employees', function(err, rows, fields) 
{
  if (err) throw err;

  console.log(rows[0]);
});

connection.end();
0

đầu ra

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
0

Trong ví dụ này, một lỗi nghiêm trọng được kích hoạt bởi một người dùng không hợp lệ

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
1

đầu ra

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
2

Các lỗi thông thường chỉ được ủy quyền cho cuộc gọi lại mà chúng thuộc về. Trong ví dụ sau, chỉ cuộc gọi lại đầu tiên nhận được lỗi (tên db sai), truy vấn thứ hai hoạt động như mong đợi

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
3Máy chủ ngắt kết nối

Bạn có thể mất kết nối với máy chủ MySQL do sự cố mạng, máy chủ hết thời gian, máy chủ được khởi động lại hoặc gặp sự cố. Tất cả những sự kiện này được coi là lỗi nghiêm trọng và sẽ có lỗi. mã = 'PROTOCOL_CONNECTION_LOST'. Xem phần Xử lý lỗi để biết thêm thông tin

Kết nối lại một kết nối được thực hiện bằng cách thiết lập một kết nối mới. Sau khi kết thúc, một đối tượng kết nối hiện có không thể được kết nối lại theo thiết kế

Với Pool, các kết nối bị ngắt kết nối sẽ bị xóa khỏi nhóm để giải phóng dung lượng cho một kết nối mới được tạo trong lệnh gọi getConnection tiếp theo

tùy chọn SSL

Tùy chọn ssl trong tùy chọn kết nối nhận một chuỗi hoặc một đối tượng. Khi được cung cấp một chuỗi, nó sẽ sử dụng một trong các cấu hình SSL được xác định trước bao gồm. Các hồ sơ sau đây được bao gồm

  • "RDS của Amazon". hồ sơ này dùng để kết nối với máy chủ Amazon RDS và chứa ca từ https. //rds. amazonaws. com/doc/rds-ssl-ca-cert. pem

Khi kết nối với các máy chủ khác, bạn sẽ cần cung cấp một đối tượng tùy chọn, có cùng định dạng với tiền điện tử. tạo thông tin xác thực. Xin lưu ý rằng các đối số mong đợi một chuỗi chứng chỉ, không phải tên tệp cho chứng chỉ. Đây là một ví dụ đơn giản

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
4

Bạn cũng có thể kết nối với máy chủ MySQL mà không cần cung cấp đúng CA thích hợp để tin cậy. bạn không nên làm điều này

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
5
{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
5

kết nối tổng hợp

Nhóm kết nối là bộ nhớ cache của các kết nối cơ sở dữ liệu được duy trì để các kết nối có thể được sử dụng lại khi có yêu cầu tới cơ sở dữ liệu trong tương lai. Nhóm kết nối được sử dụng để nâng cao hiệu suất thực thi các lệnh trên cơ sở dữ liệu

Sử dụng hồ bơi trực tiếp

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
7

Khi bạn kết nối xong, chỉ cần gọi kết nối. release() và kết nối sẽ quay trở lại nhóm, sẵn sàng để người khác sử dụng lại

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
8

Nếu bạn muốn đóng kết nối và xóa nó khỏi nhóm, hãy sử dụng kết nối. tiêu diệt () thay vào đó. Nhóm sẽ tạo một kết nối mới vào lần tiếp theo khi cần thiết

Đóng tất cả các kết nối trong một nhóm

Khi bạn sử dụng xong nhóm, bạn phải kết thúc tất cả các kết nối hoặc Nút. vòng lặp sự kiện js sẽ vẫn hoạt động cho đến khi các kết nối bị đóng bởi máy chủ MySQL. Phương thức kết thúc nhận một cuộc gọi lại tùy chọn mà bạn có thể sử dụng để biết khi tất cả các kết nối đã kết thúc. Các kết nối kết thúc thuận lợi, vì vậy tất cả các truy vấn đang chờ xử lý sẽ vẫn hoàn thành và thời gian kết thúc nhóm sẽ thay đổi. một lần hồ bơi. end() đã được gọi, pool. getConnection và các hoạt động khác không còn có thể được thực hiện

tùy chọn hồ bơi

Pool hỗ trợ tất cả các tùy chọn kết nối bình thường. Ngoài ra đây là một số tùy chọn bổ sung

NameDescriptionacquireTimeoutMili giây trước khi hết thời gian chờ trong quá trình thu thập kết nối. Điều này hơi khác so với connectTimeout, bởi vì việc có được kết nối nhóm không phải lúc nào cũng liên quan đến việc tạo kết nối. (Mặc định. 10 giây)waitForConnectionsXác định hành động của nhóm khi không có kết nối nào và đã đạt đến giới hạn. Nếu đúng, nhóm sẽ xếp hàng yêu cầu kết nối và gọi nó khi có sẵn. Nếu sai, nhóm sẽ ngay lập tức gọi lại với một lỗi. (Mặc định. true)connectionLimitSố lượng kết nối tối đa để tạo cùng một lúc. (Mặc định. 10)queueLimitSố lượng yêu cầu kết nối tối đa mà nhóm sẽ xếp hàng trước khi trả về lỗi từ getConnection. Nếu được đặt thành 0, không có giới hạn về số lượng yêu cầu kết nối được xếp hàng đợi. (Mặc định. 0)

sự kiện bể bơi

sự liên quan

Nhóm sẽ phát ra một sự kiện kết nối khi một kết nối mới được tạo trong nhóm. Nếu bạn cần đặt các biến phiên trên kết nối trước khi sử dụng, bạn có thể nghe sự kiện kết nối

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
9

hàng đợi

Nhóm sẽ phát ra một sự kiện enqueue khi một cuộc gọi lại đã được xếp hàng đợi để chờ kết nối khả dụng

$ npm install mysql
0

Thoát các giá trị truy vấn

SQL injection là một kỹ thuật (giống như các cơ chế tấn công web khác) để tấn công các ứng dụng điều khiển dữ liệu. Cuộc tấn công này có thể vượt qua tường lửa và có thể ảnh hưởng đến một hệ thống đã được vá đầy đủ. Kẻ tấn công lợi dụng các ký tự được lọc kém hoặc thoát không chính xác được nhúng trong các câu lệnh SQL để phân tích dữ liệu biến từ đầu vào của người dùng. Kẻ tấn công đưa dữ liệu tùy ý, thường là truy vấn cơ sở dữ liệu, vào một chuỗi mà cuối cùng được thực thi bởi cơ sở dữ liệu thông qua một ứng dụng web (e. g. một hình thức đăng nhập)

Để tránh các cuộc tấn công SQL Injection, bạn phải luôn thoát mọi dữ liệu do người dùng cung cấp trước khi sử dụng dữ liệu đó bên trong truy vấn SQL. Bạn có thể làm như vậy bằng cách sử dụng kết nối. thoát () hoặc nhóm. các phương thức thoát ()

$ npm install mysql
1

Ngoài ra, bạn có thể sử dụng ?

$ npm install mysql
2

Các loại giá trị khác nhau được thoát khác nhau, đây là cách

  • Những con số không bị ảnh hưởng
  • Booleans được chuyển đổi thành chuỗi true/false
  • Các đối tượng ngày được chuyển đổi thành 'YYYY-mm-dd HH. ii. chuỗi ss'
  • Bộ đệm được chuyển đổi thành chuỗi hex, e. g. X'0fa5'
  • Chuỗi được thoát an toàn
  • Mảng được biến thành danh sách, e. g. ['a', 'b'] biến thành 'a', 'b'
  • Các mảng lồng nhau được chuyển thành các danh sách được nhóm (đối với các phần chèn hàng loạt), e. g. [['a', 'b'], ['c', 'd']] biến thành ('a', 'b'), ('c', 'd')
  • Các đối tượng được biến thành cặp key = 'value'. Các đối tượng lồng nhau được chuyển thành chuỗi
  • không xác định/null được chuyển đổi thành NULL
  • NaN/Infinity được giữ nguyên. MySQL không hỗ trợ những thứ này và việc cố gắng chèn chúng dưới dạng giá trị sẽ gây ra lỗi MySQL cho đến khi chúng triển khai hỗ trợ

Đây là một ví dụ về câu lệnh INSERT INTO

$ npm install mysql
3

Bạn cũng có thể sử dụng hàm thoát trực tiếp, xem ví dụ sau

$ npm install mysql
4

Thoát định danh truy vấn

Vì định danh SQL (cơ sở dữ liệu/bảng/tên cột) được cung cấp bởi người dùng, bạn nên thoát nó bằng mysql. escapeId(số nhận dạng), kết nối. escapeId(số nhận dạng) hoặc pool. escapeId (số nhận dạng) như thế này

$ npm install mysql
5

Nó cũng hỗ trợ thêm số nhận dạng đủ điều kiện. Nó sẽ thoát khỏi cả hai phần

$ npm install mysql
6

Ngoài ra, bạn có thể sử dụng ??

$ npm install mysql
7

Ghi chú. Chuỗi ký tự cuối cùng là thử nghiệm và cú pháp có thể thay đổi

Khi bạn chuyển một đối tượng tới. thoát() hoặc. truy vấn(),. escapeId() được sử dụng để tránh SQL injection trong các khóa đối tượng

Đang chuẩn bị truy vấn

mysql 5. 6 cung cấp hỗ trợ cho các câu lệnh chuẩn bị phía máy chủ. Hỗ trợ này tận dụng giao thức nhị phân máy khách/máy chủ hiệu quả có sẵn kể từ MySQL 4. 1. Bạn có thể sử dụng mysql. định dạng để chuẩn bị truy vấn có nhiều điểm chèn, sử dụng lối thoát thích hợp cho id và giá trị. Một ví dụ đơn giản về điều này sau đây

$ npm install mysql
8

Sau đó, bạn có một truy vấn thoát, hợp lệ mà sau đó bạn có thể gửi đến cơ sở dữ liệu một cách an toàn. Điều này hữu ích nếu bạn đang tìm cách chuẩn bị truy vấn trước khi thực sự gửi nó đến cơ sở dữ liệu. như mysql. định dạng được hiển thị từ SqlString. định dạng bạn cũng có tùy chọn (nhưng không bắt buộc) để chuyển vào stringifyObject và múi giờ, cho phép bạn cung cấp phương tiện tùy chỉnh để biến đối tượng thành chuỗi, cũng như Ngày nhận biết theo vị trí/múi giờ cụ thể

định dạng tùy chỉnh

Nếu bạn muốn có một loại định dạng thoát truy vấn khác, bạn có thể sử dụng tùy chọn cấu hình kết nối để xác định hàm định dạng tùy chỉnh. Bạn có thể truy cập đối tượng kết nối nếu bạn muốn sử dụng tính năng tích hợp. escape() hoặc bất kỳ chức năng kết nối nào khác

Đây là một ví dụ về cách thực hiện một định dạng khác

$ npm install mysql
9Lấy id của một hàng đã chèn

Nếu bạn đang chèn một hàng vào một bảng có khóa chính tăng tự động, bạn có thể truy xuất id chèn như thế này

$ npm install felixge/node-mysql
0

Khi xử lý các số lớn (vượt quá giới hạn độ chính xác của Số JavaScript), bạn nên cân nhắc bật tùy chọn hỗ trợ BigNumbers để có thể đọc id chèn dưới dạng chuỗi, nếu không nó sẽ ném

Tùy chọn này cũng được yêu cầu khi tìm nạp các số lớn từ cơ sở dữ liệu, nếu không, bạn sẽ nhận được các giá trị được làm tròn thành hàng trăm hoặc hàng nghìn do giới hạn độ chính xác

Lấy số hàng bị ảnh hưởng

Bạn có thể lấy số hàng bị ảnh hưởng từ câu lệnh chèn, cập nhật hoặc xóa

"changedRows" khác với "affectedRows" ở chỗ nó không tính các hàng được cập nhật có giá trị không thay đổi

$ npm install felixge/node-mysql
1Lấy ID kết nối

Bạn có thể lấy ID kết nối MySQL ("ID luồng") của một kết nối nhất định bằng thuộc tính threadId

$ npm install felixge/node-mysql
2Thực hiện truy vấn song song

Giao thức MySQL là tuần tự, điều này có nghĩa là bạn cần nhiều kết nối để thực hiện các truy vấn song song. Bạn có thể sử dụng Nhóm để quản lý kết nối, một cách tiếp cận đơn giản là tạo một kết nối cho mỗi yêu cầu http đến

Truyền các hàng truy vấn

Đôi khi, bạn có thể muốn chọn số lượng lớn hàng và xử lý từng hàng khi nhận được. Điều này có thể được thực hiện như thế này

$ npm install felixge/node-mysql
3

Xin lưu ý một vài điều về ví dụ trên

  • Thông thường, bạn sẽ muốn nhận một lượng hàng nhất định trước khi bắt đầu điều chỉnh kết nối bằng cách sử dụng pause(). Con số này sẽ phụ thuộc vào số lượng và kích thước hàng của bạn
  • pause() / resume() hoạt động trên ổ cắm và trình phân tích cú pháp bên dưới. Bạn được đảm bảo rằng sẽ không có sự kiện 'kết quả' nào kích hoạt sau khi gọi hàm pause()
  • Bạn KHÔNG ĐƯỢC cung cấp lệnh gọi lại cho phương thức query() khi truyền phát hàng
  • Sự kiện 'kết quả' sẽ kích hoạt cho cả hai hàng cũng như các gói OK xác nhận thành công của truy vấn CHÈN/CẬP NHẬT

Ngoài ra, bạn có thể muốn biết rằng hiện tại không thể phát trực tuyến các cột hàng riêng lẻ, chúng sẽ luôn được lưu vào bộ đệm hoàn toàn. Nếu bạn có trường hợp sử dụng tốt để truyền các trường lớn đến và từ MySQL, tôi rất muốn nhận được những suy nghĩ và đóng góp của bạn về vấn đề này

Truy vấn nhiều câu lệnh

Hỗ trợ cho nhiều câu lệnh bị vô hiệu hóa vì lý do bảo mật (nó cho phép tấn công SQL injection nếu các giá trị không được thoát đúng cách). Để sử dụng tính năng này, bạn phải bật tính năng này cho kết nối của mình

$ npm install felixge/node-mysql
4

Sau khi được bật, bạn có thể thực hiện nhiều truy vấn câu lệnh giống như bất kỳ truy vấn nào khác

$ npm install felixge/node-mysql
5

Ngoài ra, bạn cũng có thể truyền kết quả của nhiều truy vấn câu lệnh

$ npm install felixge/node-mysql
6

Nếu một trong các câu lệnh trong truy vấn của bạn gây ra lỗi, thì đối tượng Lỗi kết quả chứa lỗi. thuộc tính chỉ mục cho bạn biết câu lệnh nào đã gây ra nó. MySQL cũng sẽ ngừng thực hiện mọi câu lệnh còn lại khi xảy ra lỗi

Xin lưu ý rằng giao diện truyền trực tuyến nhiều truy vấn câu lệnh là thử nghiệm và tôi rất mong nhận được phản hồi về giao diện này

thủ tục lưu trữ

Bạn có thể gọi các thủ tục được lưu trữ từ các truy vấn của mình như với bất kỳ trình điều khiển mysql nào khác. Đây là mã thủ tục ban đầu

$ npm install felixge/node-mysql
7

Đầu ra khi nó được thực thi trong MySQL

$ npm install felixge/node-mysql
8

Bây giờ hãy gọi thủ tục được lưu trữ từ nút. js

$ npm install felixge/node-mysql
9

đầu ra

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
0

tham gia

Bạn có thể gọi THAM GIA từ các truy vấn của mình như với bất kỳ trình điều khiển mysql nào khác. Đây là một ví dụ

Viết truy vấn để hiển thị ID bộ phận, tên bộ phận và tên người quản lý. Xem ''cơ sở dữ liệu

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
1

đầu ra

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
2

giao dịch

MySQL (ở đây chúng tôi duy trì phiên bản 5. 6) hỗ trợ các giao dịch cục bộ (trong một phiên khách hàng nhất định) thông qua các câu lệnh như SET tự động cam kết, BẮT ĐẦU GIAO DỊCH, CAM KẾT và ROLLBACK. Đây là cú pháp BẮT ĐẦU GIAO DỊCH, CAM KẾT và ROLLBACK

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
3

trong nút. hỗ trợ giao dịch đơn giản js có sẵn ở cấp độ kết nối

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
4

Xin lưu ý rằng beginTransaction(), commit() và rollback() chỉ đơn giản là các hàm tiện lợi thực thi các lệnh START TRANSACTION, CAMIT và ROLLBACK tương ứng. Điều quan trọng là phải hiểu rằng nhiều lệnh trong MySQL có thể gây ra một cam kết ngầm định, như được mô tả trong tài liệu MySQL

Hết giờ

Mọi hoạt động đều có tùy chọn thời gian chờ không hoạt động tùy chọn. Điều này cho phép bạn chỉ định thời gian chờ thích hợp cho các hoạt động. Điều quan trọng cần lưu ý là những thời gian chờ này không phải là một phần của giao thức MySQL và các hoạt động hết thời gian chờ thông qua máy khách. Điều này có nghĩa là khi hết thời gian chờ, kết nối xảy ra trên đó sẽ bị hủy và không thể thực hiện thêm thao tác nào nữa

Làm cách nào để sử dụng async đang chờ với MySQL trong Node?

Sử dụng async/await với MySQL . Như bạn có thể thấy, tham số gọi lại dự kiến ​​là một hàm trả về một lời hứa. Ở đây, chúng tôi sử dụng từ khóa async với hàm mũi tên để dễ dàng tạo hàm gọi lại không đồng bộ .

Làm cách nào để đặt thời gian chờ truy vấn MySQL?

Đăng nhập vào máy chủ của bạn bằng cách sử dụng Secure Shell® (SSH). Sử dụng lệnh sudo để chỉnh sửa. cnf , tệp cấu hình MySQL®. Tìm cấu hình thời gian chờ và thực hiện các điều chỉnh phù hợp với máy chủ của bạn .

Sử dụng MySQL với nút js có tốt không?

js được kết hợp với MongoDB và các cơ sở dữ liệu NoSQL khác, nhưng Node. js cũng hoạt động tốt với các cơ sở dữ liệu quan hệ như MySQL . Nếu bạn muốn viết một microservice mới với Node. js cho cơ sở dữ liệu hiện có, rất có thể bạn sẽ sử dụng MySQL, một trong những cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới.

Làm thế nào để sử dụng chờ đợi trong nodejs?

Các chức năng không đồng bộ có sẵn trong Node và được biểu thị bằng từ khóa async trong phần khai báo của chúng. Họ luôn trả lại một lời hứa, ngay cả khi bạn không viết rõ ràng cho họ để làm như vậy. Ngoài ra, từ khóa chờ đợi chỉ khả dụng bên trong các chức năng không đồng bộ tại thời điểm này – nó không thể được sử dụng trong phạm vi toàn cầu