MySQL với Node.js


376

Tôi mới bắt đầu tham gia vào Node.js. Tôi đến từ nền tảng PHP, vì vậy tôi khá quen với việc sử dụng MySQL cho tất cả các nhu cầu cơ sở dữ liệu của mình.

Làm cách nào tôi có thể sử dụng MySQL với Node.js?


5
cuối cùng bạn đã đi với cái gì Có một số thông tin tốt dưới đây, tôi rất muốn nghe những trải nghiệm của bạn
Landon

7
@Landon, thực sự đã đi với nút-mysql vì một số lý do, chủ yếu là vì nó đang phát triển khá tích cực và dường như được sử dụng rộng rãi nhất. Tôi cũng thực sự thích multipleStatementschức năng này.
thập dữ liệu

@crawf Bạn thích gì hơn, PHP hay Node.js? Tôi đã nhảy vào PHP / MySQL, nhưng tôi đang nghĩ đến việc chuyển sang nút vì nó hoàn toàn cảm thấy tự nhiên hơn khi xem cú pháp là cú pháp JS
oldboy

1
@Anthony Sở thích cá nhân Tôi cho rằng, nó phụ thuộc vào hệ sinh thái mà bạn đang phát triển, nếu bạn ở trong một nhóm, v.v. Bài đăng gốc này là cổ xưa, và rất nhiều điều đã thay đổi trong bối cảnh Node nơi phổ biến hơn nhiều về phía trước và kết thúc công việc. Tôi muốn nói rằng nếu bạn có thời gian để cho Node đi, và nó tuyệt vời kết hợp với những thứ như socket.io cho các ổ cắm web thời gian thực.
thập thông tin

Câu trả lời:


427

Kiểm tra danh sách mô-đun node.js

  • node-mysql - Một mô-đun node.js thực hiện giao thức MySQL
  • node-mysql2 - Một trình điều khiển async thuần túy khác. Đường ống, báo cáo chuẩn bị.
  • node-mysql-libmysqlclient - Các ràng buộc không đồng bộ của MySQL dựa trên libmysqlclient

nút-mysql trông đủ đơn giản:

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

connection.connect(function(err) {
  // connected! (unless `err` is set)
});

Truy vấn:

var post  = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
  // Neat!
});
console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

81
+1 cho nút-mysql thực sự giúp sử dụng các câu lệnh được chuẩn bị dễ dàng hơn so với việc không sử dụng chúng
Kevin Laity

2
github.com/bminer/node-mysql-queues cho các giao dịch và hỗ trợ nhiều câu lệnh để sử dụng với nút-mysql.
BMiner

2
+1 cho nút-mysql cũng vậy. Điều gì có thể tốt hơn là chỉ cần requiremột thư viện javascript
Alex K

4
@KevinLaity Tôi có ấn tượng rằng nút-mysql chưa chuẩn bị các câu lệnh được triển khai. Cú pháp trông giống nhau . Thay vào đó, có vẻ như, hiện tại, các nhân vật đặc biệt đang được trốn thoát.
funseiki

4
Ngoài ra, bạn có thể nhận tên cơ sở dữ liệu của mình thêm 'cơ sở dữ liệu' vào đối tượng kết nối
felipekm

29

node-mysql có lẽ là một trong những mô-đun tốt nhất hiện được sử dụng để làm việc với cơ sở dữ liệu MySQL được duy trì tích cực và được ghi chép tốt.


20

Vì đây là một chủ đề cũ chỉ cần thêm một bản cập nhật:

Để cài đặt trình điều khiển MySQL node.js:

Nếu bạn chỉ chạy npm install mysql, bạn cần ở trong cùng thư mục mà máy chủ của bạn chạy. Tôi sẽ khuyên bạn nên làm như một trong những ví dụ sau:

Để cài đặt toàn cầu:

npm install -g mysql

Để cài đặt cục bộ:

1- Thêm nó package.jsonvào phần phụ thuộc của bạn :

"dependencies": {
    "mysql": "~2.3.2",
     ...

2- chạy npm install


Lưu ý rằng để các kết nối xảy ra, bạn cũng cần phải chạy máy chủ mysql (độc lập với nút)

Để cài đặt máy chủ MySQL:

Có một loạt các hướng dẫn ngoài kia giải thích điều này, và nó hơi phụ thuộc vào hệ thống phẫu thuật. Chỉ cần truy cập google và tìm kiếm how to install mysql server [Ubuntu|MacOSX|Windows]. Nhưng trong một câu: bạn phải truy cập vào http://www.mysql.com/doads/ và cài đặt nó.


3
npm install --save mysqlsẽ cài đặt nó package.jsontự động thêm nó vào
Xeoncross

11

Đây là mã sản xuất có thể giúp bạn.

Gói.json

{
  "name": "node-mysql",
  "version": "0.0.1",
  "dependencies": {
    "express": "^4.10.6",
    "mysql": "^2.5.4"
  }
}

Đây là tập tin máy chủ.

var express   =    require("express");
var mysql     =    require('mysql');
var app       =    express();

var pool      =    mysql.createPool({
    connectionLimit : 100, //important
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'address_book',
    debug    :  false
});

function handle_database(req,res) {

    pool.getConnection(function(err,connection){
        if (err) {
          connection.release();
          res.json({"code" : 100, "status" : "Error in connection database"});
          return;
        }   

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

        connection.query("select * from user",function(err,rows){
            connection.release();
            if(!err) {
                res.json(rows);
            }           
        });

        connection.on('error', function(err) {      
              res.json({"code" : 100, "status" : "Error in connection database"});
              return;     
        });
  });
}

app.get("/",function(req,res){-
        handle_database(req,res);
});

app.listen(3000);

Tham khảo: https://codeforgeek.com/2015/01/nodejs-mysql-tutorial/


Mã này có vẻ sai sót .. nhiều lỗi bao gồmCannot read property 'release' of undefined
Pacerier

4

Imo, bạn nên thử MySQL Connector / Node.js, trình điều khiển Node.js chính thức cho MySQL. Xem ref-1ref-2 để được giải thích chi tiết. Tôi đã thử mysqljs / mysql có sẵn ở đây , nhưng tôi không tìm thấy tài liệu chi tiết về các lớp, phương thức, thuộc tính của thư viện này.

Vì vậy, tôi đã chuyển sang tiêu chuẩn MySQL Connector/Node.jsvới X DevAPI, vì nó là một thư viện máy khách dựa trên Promise không đồng bộ và cung cấp tài liệu tốt. Hãy xem đoạn mã sau:

const mysqlx = require('@mysql/xdevapi');
const rows = [];

mysqlx.getSession('mysqlx://localhost:33060')
.then(session => {
    const table = session.getSchema('testSchema').getTable('testTable');

    // The criteria is defined through the expression.
    return table.update().where('name = "bar"').set('age', 50)
        .execute()
        .then(() => {
            return table.select().orderBy('name ASC')
                .execute(row => rows.push(row));
        });
})
.then(() => {
    console.log(rows);
});

3

KnexJ có thể được sử dụng như một trình xây dựng truy vấn SQL trong cả Node.JS và trình duyệt. Tôi thấy nó dễ sử dụng. Hãy thử nó - Knex.js

$ npm install knex --save
# Then add one of the following (adding a --save) flag:
$ npm install pg
$ npm install sqlite3
$ npm install mysql
$ npm install mysql2
$ npm install mariasql
$ npm install strong-oracle
$ npm install oracle
$ npm install mssql


var knex = require('knex')({
  client: 'mysql',
  connection: {
    host : '127.0.0.1',
    user : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  }
});

Bạn có thể sử dụng nó như thế này

knex.select('*').from('users')

hoặc là

knex('users').where({
  first_name: 'Test',
  last_name:  'User'
}).select('id')

1

Bạn cũng có thể thử một nỗ lực mới hơn được gọi là Node.js DB nhằm mục đích cung cấp một khung chung cho một số công cụ cơ sở dữ liệu. Nó được xây dựng với C ++ nên hiệu suất được đảm bảo.

Cụ thể, bạn có thể sử dụng trình điều khiển db-mysql của nó để hỗ trợ Node.js MySQL .


1
Cảm ơn! Tôi cũng sẽ cho đi.
thập thông tin

4
nút-db không còn được hỗ trợ (không hoạt động trong 8 tháng, sử dụng nút-waf không dùng nữa) và việc cài đặt không thành công đối với tôi.
Yogu

18
"Nó được xây dựng với C ++ nên hiệu suất được đảm bảo" - đơn giản là sử dụng C ++ không đảm bảo hiệu suất, nó vẫn phải được lập trình chính xác.
nhà phát triển xe máy

Không chỉ là nút-db không được hỗ trợ, liên kết đã chết - được chuyển hướng đến một loại trang web quảng cáo nào đó ngay bây giờ. Hạ cấp.
nurdglaw

2
@Mariano, Link Down
Pacerier

0

kết nối cơ sở dữ liệu mysql bằng cách cài đặt một thư viện. ở đây, chọn mô-đun nút-mysql ổn định và dễ sử dụng.

npm install mysql@2.0.0-alpha2

var http = require('http'),
   mysql = require('mysql');

var sqlInfo = {
   host: 'localhost',
   user: 'root',
   password: 'urpass',
   database: 'dbname'
}
client = mysql.createConnection(sqlInfo);

client.connect();

Ví dụ về kết nối và truy vấn NodeJS mysql


2
Theo như tôi biết thì các bản phát hành alpha không bao giờ được coi là "ổn định". Sửa tôi nếu tôi sai. Alpha có khả năng thay đổi đáng kể API của nó trước khi đi đến trận chung kết, điều rất không mong muốn trong mã sản xuất (và thậm chí là phát triển). Đó là, nếu việc đánh số phiên bản tuân theo các nguyên tắc semver.org .
Robin van Baalen

1
Các trích dẫn "thông minh" ('') hóa ra không thông minh trong các tệp js.
glyph

Tôi thích bình luận này vì nó cho thấy nơi đặt tên cơ sở dữ liệu
Boris Ivanov

0

Bạn có thể bỏ qua ORM, trình xây dựng, v.v. và đơn giản hóa việc quản lý DB / SQL của bạn bằng cách sử dụng sqlersqler-mdb.

-- create this file at: db/mdb/setup/create.database.sql
CREATE DATABASE IF NOT EXISTS sqlermysql
const conf = {
  "univ": {
    "db": {
      "mdb": {
        "host": "localhost",
        "username":"admin",
        "password": "mysqlpassword"
      }
    }
  },
  "db": {
    "dialects": {
      "mdb": "sqler-mdb"
    },
    "connections": [
      {
        "id": "mdb",
        "name": "mdb",
        "dir": "db/mdb",
        "service": "MySQL",
        "dialect": "mdb",
        "pool": {},
        "driverOptions": {
          "connection": {
            "multipleStatements": true
          }
        }
      }
    ]
  }
};

// create/initialize manager
const manager = new Manager(conf);
await manager.init();

// .sql file path is path to db function
const result = await manager.db.mdb.setup.create.database();

console.log('Result:', result);

// after we're done using the manager we should close it
process.on('SIGINT', async function sigintDB() {
  await manager.close();
  console.log('Manager has been closed');
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.