MySQL กับ Node.js


375

ฉันเพิ่งเริ่มเข้าสู่ Node.js ฉันมาจากพื้นหลัง PHP ดังนั้นฉันค่อนข้างคุ้นเคยกับการใช้ MySQL สำหรับฐานข้อมูลทั้งหมดของฉัน

ฉันจะใช้ MySQL กับ Node.js ได้อย่างไร


5
ท้ายที่สุดคุณจะไปกับอะไร? มีข้อมูลที่ดีด้านล่างนี้ฉันอยากจะฟังว่าประสบการณ์ของคุณคืออะไร
Landon

7
@ Landon ไปกับ node-mysql ด้วยเหตุผลสองสามประการส่วนใหญ่เป็นเพราะการพัฒนาค่อนข้างแอคทีฟและดูเหมือนจะใช้กันอย่างแพร่หลาย ฉันยังชอบmultipleStatementsฟังก์ชั่น
รวบรวมข้อมูล

@crawf คุณต้องการอะไร PHP หรือ Node.js ฉันกระโดดเป็น PHP / MySQL แต่ฉันคิดว่าจะเปลี่ยนเป็นโหนดเนื่องจากมันจะรู้สึกเป็นธรรมชาติมากขึ้นเมื่อพิจารณาจากไวยากรณ์คือ JS syntax
oldboy

1
@Anthony การตั้งค่าส่วนตัวฉันคิดว่ามันขึ้นอยู่กับระบบนิเวศที่คุณกำลังพัฒนาถ้าคุณอยู่ในทีม ฯลฯ โพสต์ดั้งเดิมนี้เก่าแก่และมีการเปลี่ยนแปลงมากมายในภูมิทัศน์โหนดซึ่งเป็นเรื่องธรรมดามากที่อยู่ตรงหน้า และงานส่วนหลัง ฉันจะบอกว่าถ้าคุณมีเวลาที่จะให้โหนดไปและมันยอดเยี่ยมจับคู่กับสิ่งต่างๆเช่น socket.io สำหรับซ็อกเก็ตเว็บแบบเรียลไทม์
คลาน

คำตอบ:


426

ตรวจสอบรายการโมดูล node.js

  • node-mysql - โมดูล node.js ใช้โปรโตคอล MySQL
  • node-mysql2 - อีกหนึ่งไดรเวอร์ JS async แท้ วางท่อจัดทำงบ
  • node-mysql-libmysqlclient - การเชื่อม MySQL แบบอะซิงโครนัสตาม libmysqlclient

node-mysql ดูเรียบง่ายพอ:

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

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

คำสั่ง:

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 สำหรับโหนด MySQL จริงทำให้มันง่ายที่จะใช้งบเตรียมกว่าที่จะไม่ใช้พวกเขา
เควินฆราวาส

2
github.com/bminer/node-mysql-queuesสำหรับการทำธุรกรรมและการสนับสนุนคำสั่งหลายรายการสำหรับใช้กับ node-mysql
BMiner

2
+1 สำหรับ node-mysql ด้วย อะไรจะดีไปกว่าrequireการใช้ห้องสมุดจาวาสคริปต์
Alex K

4
@KevinLaity ฉันรู้สึกว่า node-mysql ยังไม่ได้เตรียมคำสั่งที่ใช้ ไวยากรณ์เพียงแค่มีลักษณะคล้าย ปรากฏว่าในตอนนี้ตัวละครพิเศษกำลังหลบหนี
funseiki

4
นอกจากนี้คุณสามารถรับชื่อฐานข้อมูลของคุณเพิ่ม 'ฐานข้อมูล' ไปยังวัตถุการเชื่อมต่อ
felipekm

28

node-mysqlอาจเป็นหนึ่งในโมดูลที่ดีที่สุดที่ใช้ในการทำงานกับฐานข้อมูล MySQL ซึ่งได้รับการบำรุงรักษาและจัดทำเป็นเอกสารอย่างดี


19

เนื่องจากนี่เป็นเธรดเก่าที่เพิ่งเพิ่มการอัปเดต:

ในการติดตั้งไดรเวอร์ MySQL node.js:

หากคุณเรียกใช้เพียงแค่npm install mysqlคุณต้องอยู่ในไดเรกทอรีเดียวกับที่ใช้เซิร์ฟเวอร์ของคุณ ฉันอยากจะแนะนำให้ทำอย่างหนึ่งในตัวอย่างต่อไปนี้:

สำหรับการติดตั้งทั่วโลก:

npm install -g mysql

สำหรับการติดตั้งในพื้นที่:

1- เพิ่มลงpackage.jsonในการอ้างอิงของคุณ:

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

2- วิ่ง npm install


โปรดทราบว่าสำหรับการเชื่อมต่อที่จะเกิดขึ้นคุณจะต้องใช้เซิร์ฟเวอร์ mysql (ซึ่งเป็นโหนดอิสระ)

ในการติดตั้งเซิร์ฟเวอร์ MySQL:

มีบทเรียนมากมายที่อธิบายสิ่งนี้และมันก็ขึ้นอยู่กับระบบปฏิบัติการ เพียงแค่ไปที่ google how to install mysql server [Ubuntu|MacOSX|Windows]และค้นหา แต่ในประโยค: คุณต้องไปที่http://www.mysql.com/downloads/และติดตั้ง


2
npm install --save mysqlจะทำการติดตั้งเพิ่มลงในเครื่องของคุณpackage.jsonโดยอัตโนมัติ
Xeoncross

10

นี่คือรหัสการผลิตที่อาจช่วยคุณได้

Package.json

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

นี่คือไฟล์เซิร์ฟเวอร์

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);

ข้อมูลอ้างอิง: https://codeforgeek.com/2015/01/nodejs-mysql-tutorial/


รหัสนี้ดูเหมือนจะเมาแล้ว .. ข้อผิดพลาดมากมายรวมถึงCannot read property 'release' of undefined
Pacerier

3

KnexJs สามารถใช้เป็นตัวสร้างแบบสอบถาม SQL ได้ทั้ง Node.JS และเบราว์เซอร์ ฉันคิดว่ามันใช้งานง่าย ลองเลย - 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'
  }
});

คุณสามารถใช้มันได้เช่นนี้

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

หรือ

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

3

คุณควรลองใช้ MySQL Connector / Node.js ซึ่งเป็นไดร์เวอร์ Node.js อย่างเป็นทางการสำหรับ MySQL ดูref-1และref-2สำหรับคำอธิบายโดยละเอียด ฉันได้ลอง mysqljs / mysql ซึ่งมีอยู่ที่นี่แต่ฉันไม่พบเอกสารรายละเอียดเกี่ยวกับชั้นเรียนวิธีการคุณสมบัติของห้องสมุดนี้

ดังนั้นฉันจึงเปลี่ยนเป็นมาตรฐานMySQL Connector/Node.jsด้วยX DevAPIเพราะมันเป็นไลบรารี่ของลูกค้าที่ใช้ Asynchronous-Promiseและให้เอกสารที่ดี ดูตัวอย่างโค้ดต่อไปนี้:

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);
});

1

นอกจากนี้คุณยังสามารถลองใช้ความพยายามที่ใหม่กว่าที่รู้จักกันในชื่อNode.js DBที่มีวัตถุประสงค์เพื่อจัดเตรียมเฟรมเวิร์กทั่วไปสำหรับเอ็นจินฐานข้อมูลหลายตัว มันถูกสร้างขึ้นด้วย C ++ เพื่อรับประกันประสิทธิภาพ

โดยเฉพาะคุณสามารถใช้ไดรเวอร์ DB-MySQL สำหรับการสนับสนุน Node.js MySQL


1
ขอบคุณ! ฉันจะให้มันไปด้วย
crawf

4
node-db ไม่ได้รับการสนับสนุนอีกต่อไป (ไม่ได้ใช้งานเป็นเวลา 8 เดือนใช้ node-waf ที่เลิกใช้แล้ว) และการติดตั้งล้มเหลวสำหรับฉัน
Yogu

18
"มันสร้างขึ้นด้วย C ++ เพื่อรับประกันประสิทธิภาพ" - เพียงแค่ใช้ C ++ ไม่รับประกันประสิทธิภาพก็ยังต้องมีการตั้งโปรแกรมอย่างถูกต้อง
developerbmw

ไม่สนับสนุน node-db เท่านั้นลิงค์นี้เป็น dead-ish - ถูกเปลี่ยนเส้นทางไปยังเว็บไซต์โฆษณาบางประเภทในตอนนี้ downvoting
nurdglaw

2
@Mariano, ลิงก์ลง
Pacerier

0

เชื่อมต่อฐานข้อมูล mysql โดยติดตั้งห้องสมุด ที่นี่เลือกโมดูล node-mysql ที่เสถียรและใช้งานง่าย

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();

สำหรับ NodeJS mysql เชื่อมต่อและสอบถามตัวอย่าง


2
เท่าที่ฉันทราบการเปิดตัวของอัลฟานั้นไม่เคยเกี่ยวข้องกับ 'มั่นคง' ช่วยแก้ให้ด้วยนะถ้าฉันผิด. อัลฟ่ามีความเป็นไปได้ที่จะเปลี่ยนเป็น API อย่างรวดเร็วก่อนที่จะถึงขั้นสุดท้ายซึ่งเป็นที่ต้องการอย่างมากในการผลิตโค้ด (และแม้แต่การพัฒนา) นั่นคือหากการกำหนดหมายเลขเวอร์ชันเป็นไปตามหลักเกณฑ์ของsemver.org
Robin van Baalen

1
เครื่องหมายคำพูด "ฉลาด" ('') ปรากฏว่าไม่ฉลาดในไฟล์ js
สัญลักษณ์

ฉันชอบความคิดเห็นนี้เพราะมันแสดงตำแหน่งที่จะใส่ชื่อฐานข้อมูล
Boris Ivanov

0

คุณสามารถข้ามออม, ผู้สร้าง, ฯลฯ และลดความซับซ้อนของการจัดการฐานข้อมูล / SQL ของคุณโดยใช้และ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');
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.