翻訳:Node.jsとExpressでMySqlを使用する方法

mysqlデータベースに接続します

その前に、正しいnpmパッケージをインストールしてください。

    npm install mysql

mysqlは、必要なすべての機能を提供する非常に使いやすいモジュールです。インストール後、データベースに接続するために必要な方法は次のとおりです。

var mysql = require('mysql')

var connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_user',
  password: 'some_secret',
  database: 'database'
})

connection.connect(function(err) {
    
    
  if (err) throw err
  console.log('You are now connected...')
})


これで、データベースの読み取りと書き込みができます。

mysqlデータベースの読み取りと書き込み

データベースへの接続方法はすでに知っているので、簡単な例を見てみましょう。

var mysql = require('mysql')

var connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_user',
  password: 'some_secret',
  database: 'database'
})

connection.connect(function(err) {
    
    
  if (err) throw err
  console.log('You are now connected...')

  connection.query('CREATE TABLE people(id int primary key, name varchar(255), age int, address text)', function(err, result) {
    
    
    if (err) throw err
    connection.query('INSERT INTO people (name, age, address) VALUES (?, ?, ?)', ['Larry', '41', 'California, USA'], function(err, result) {
    
    
      if (err) throw err
      connection.query('SELECT * FROM people', function(err, results) {
    
    
        if (err) throw err
        console.log(results[0].id)
        console.log(results[0].name)
        console.log(results[0].age)
        console.log(results[0].address)
      })
    })
  })
})

上のプレースホルダーを見ると、?使いやすくなるだけでなく、安全でもあります。

db.jsファイルを置き換えます

表示されるmysqlモジュールは非常に簡単ですが、実際のアプリケーションにはより複雑な要件があります。これが、MongoDBの接続と操作で、接続の管理に役立つ別のファイルdb.jsを作成する理由です。
その機能は、資格情報を頻繁に入力する必要がないときはいつでも、データベースに簡単に接続することです。2番目の目標は、テストを簡単に実行することです。

var mysql = require('mysql')
  , async = require('async')

var PRODUCTION_DB = 'app_prod_database'
  , TEST_DB = 'app_test_database'

exports.MODE_TEST = 'mode_test'
exports.MODE_PRODUCTION = 'mode_production'

var state = {
  pool: null,
  mode: null,
}

exports.connect = function(mode, done) {
    
    
  state.pool = mysql.createPool({
    host: 'localhost',
    user: 'your_user',
    password: 'some_secret',
    database: mode === exports.MODE_PRODUCTION ? PRODUCTION_DB : TEST_DB
  })

  state.mode = mode
  done()
}

exports.get = function() {
    
    
  return state.pool
}

exports.fixtures = function(data) {
    
    
  var pool = state.pool
  if (!pool) return done(new Error('Missing database connection.'))

  var names = Object.keys(data.tables)
  async.each(names, function(name, cb) {
    
    
    async.each(data.tables[name], function(row, cb) {
    
    
      var keys = Object.keys(row)
        , values = keys.map(function(key) {
    
     return "'" + row[key] + "'" })

      pool.query('INSERT INTO ' + name + ' (' + keys.join(',') + ') VALUES (' + values.join(',') + ')', cb)
    }, cb)
  }, done)
}

exports.drop = function(tables, done) {
    
    
  var pool = state.pool
  if (!pool) return done(new Error('Missing database connection.'))

  async.each(tables, function(name, cb) {
    
    
    pool.query('DELETE * FROM ' + name, cb)
  }, done)
}

このdb.jsは、以前のものよりも少し複雑です。

まず、データベースに接続する方法を提供します。実動モジュールとテストモジュール
に接続できます。テストモジュールは、自動テスト中にのみ実行されます。

次に、get常に有効な接続を提供する方法があり、データベースのクエリにも使用できます。さらに、パスワードを設定することができ、他のモジュールもこのメソッドを呼び出すことができます。

最後に、2つの方法がfixturesありdrop、テストを終了するのは簡単です。

ドロップはデータをクリアします。テストする前にテストデータベースを常に空にするのに役立ちます。

フィクスチャはjsonオブジェクトを使用してデータベースにデータをロードします。例を参照してください。

var data = {
  tables: {
    people: [
     {id: 1, name: "John", age: 32},
     {id: 2, name: "Peter", age: 29},
    ],
    cars: [
      {id: 1, brand: "Jeep", model: "Cherokee", owner_id: 2},
      {id: 2, brand: "BMW", model: "X5", owner_id: 2},
      {id: 3, brand: "Volkswagen", model: "Polo", owner_id: 1},
    ],
  },
}

var db = require('./db')
db.connect(db.MODE_PRODUCTION, function() {
    
    
  db.fixtures(data, function(err) {
    
    
    if (err) return console.log(err)
    console.log('Data has been loaded...')
  })
})

SQLを使用してモジュールを構築する

すべての準備が整いました。アプリケーションでdb.jsを使用する方法を見てみましょう。例を見てみましょう:

controllers/
  comments.js
  users.js
models/
  comment.js
  user.js
views/
app.js
db.js
package.json

app.jsは、アプリケーションのエントリポイントであり、データベース接続を設定する場所です。例を見てみましょう:

var db = require('./db')

app.use('/comments', require('./controllers/comments'))
app.use('/users', require('./controllers/users'))

// Connect to MySQL on start
db.connect(db.MODE_PRODUCTION, function(err) {
    
    
  if (err) {
    console.log('Unable to connect to MySQL.')
    process.exit(1)
  } else {
    app.listen(3000, function() {
    
    
      console.log('Listening on port 3000...')
    })
  }
})

アプリケーションは、このモジュールを介してデータベースと対話します。例を見てみましょう:

var db = require('../db.js')

exports.create = function(userId, text, done) {
    
    
  var values = [userId, text, new Date().toISOString()]

  db.get().query('INSERT INTO comments (user_id, text, date) VALUES(?, ?, ?)', values, function(err, result) {
    
    
    if (err) return done(err)
    done(null, result.insertId)
  })
}

exports.getAll = function(done) {
    
    
  db.get().query('SELECT * FROM comments', function (err, rows) {
    
    
    if (err) return done(err)
    done(null, rows)
  })
}

exports.getAllByUser = function(userId, done) {
    
    
  db.get().query('SELECT * FROM comments WHERE user_id = ?', userId, function (err, rows) {
    
    
    if (err) return done(err)
    done(null, rows)
  })
}

ご覧のとおり、db.jsは、有料でデータベースに接続する必要がないという問題です。また、本番環境でもテスト環境でも問題です。

読み取りと書き込みに異なるインスタンスを使用する

アプリケーションのニーズが高まるにつれ、今日の多くのアプリケーションは読み取り指向になっています。これは、人々がデータを書き込むよりもデータを読み取ることが少ないことを意味します。たとえば、このタイプのアプリケーションのすべてのソーシャルネットワーキングサイトでは、ステータスは通常1回だけ読み取られますが、その後何千人もの人々によって読み取られます。この場合、通常、すべての書き込みを受け入れるメインデータベースがあり、一部のMySQLインスタンスに同期すると、要求のみが読み取られます。ユーザー数が多い場合は、読み取るデータベースを簡単に追加できますが、アプリケーションは引き続き非常に高速です。

しかし、初期化でこの問題を解決するにはどうすればよいですか?mysqlモジュールのPoolCluster機能は非常に便利で、複数のインスタンスを構成してから、それらすべてに接続できます。db.jsの例を見てください。

var mysql = require('mysql')
  , async = require('async')

var PRODUCTION_DB = 'app_prod_database'
  , TEST_DB = 'app_test_database'

exports.MODE_TEST = 'mode_test'
exports.MODE_PRODUCTION = 'mode_production'

var state = {
  pool: null,
  mode: null,
}

exports.connect = function(mode, done) {
    
    
  if (mode === exports.MODE_PRODUCTION) {
    state.pool = mysql.createPoolCluster()

    state.pool.add('WRITE', {
      host: '192.168.0.5',
      user: 'your_user',
      password: 'some_secret',
      database: PRODUCTION_DB
    })

    state.pool.add('READ1', {
      host: '192.168.0.6',
      user: 'your_user',
      password: 'some_secret',
      database: PRODUCTION_DB
    })

    state.pool.add('READ2', {
      host: '192.168.0.7',
      user: 'your_user',
      password: 'some_secret',
      database: PRODUCTION_DB
    })
  } else {
    state.pool = mysql.createPool({
      host: 'localhost',
      user: 'your_user',
      password: 'some_secret',
      database: TEST_DB
    })
  }

  state.mode = mode
  done()
}

exports.READ = 'read'
exports.WRITE = 'write'

exports.get = function(type, done) {
    
    
  var pool = state.pool
  if (!pool) return done(new Error('Missing database connection.'))

  if (type === exports.WRITE) {
    state.pool.getConnection('WRITE', function (err, connection) {
    
    
      if (err) return done(err)
      done(null, connection)
    })
  } else {
    state.pool.getConnection('READ*', function (err, connection) {
    
    
      if (err) return done(err)
      done(null, connection)
    })
  }
}

exports.fixtures = function(data) {
    
    
  var pool = state.pool
  if (!pool) return done(new Error('Missing database connection.'))

  var names = Object.keys(data.tables)
  async.each(names, function(name, cb) {
    
    
    async.each(data.tables[name], function(row, cb) {
    
    
      var keys = Object.keys(row)
        , values = keys.map(function(key) {
    
     return "'" + row[key] + "'" })

      pool.query('INSERT INTO ' + name + ' (' + keys.join(',') + ') VALUES (' + values.join(',') + ')', cb)
    }, cb)
  }, done)
}

exports.drop = function(tables, done) {
    
    
  var pool = state.pool
  if (!pool) return done(new Error('Missing database connection.'))

  async.each(tables, function(name, cb) {
    
    
    pool.query('DELETE * FROM ' + name, cb)
  }, done)
}

前のものと異なる点が3つあります。

  1. テストモードで接続方法で接続する場合は、前と同じようにしてください。ただし、本番モードの場合は、さらに3台のサーバーを追加します。各サーバーには名前があり、最初のサーバーはWRITEで、他の2つはREAD1合計READ2です。それぞれの目的が何であるかを明確にする必要があります。READ1そして、READ2あるWRITE奴隷、そのたびに誰かがにデータを書き込みWRITE、その後、迅速にREAD1かつREAD2利用可能。
  2. 2番目の変更はgetメソッドです。以前は、すぐに接続を返していました。これで、2番目のパラメーターとして提供されたコールバック関数への接続が返されます。
  3. 最後の変更はgetメソッドにあります。データベースに接続するときは、接続のタイプにREADWRITEを指定する必要があります次に、サーバーに設定された名前に従って、正しいタイプの接続を提供します。この場合getConnection、適切なデータベースを選択できるようにパターンシステムが提供されていることがわかります。

次に、db.js使用例を見てみましょう

var db = require('../db.js')

exports.create = function(userId, text, done) {
    
    
  var values = [userId, text, new Date().toISOString()]

  db.get(db.WRITE, function(err, connection) {
    
    
    if (err) return done('Database problem')

    connection.query('INSERT INTO comments (user_id, text, date) VALUES(?, ?, ?)', values, function(err, result) {
    
    
      if (err) return done(err)
      done(null, result.insertId)
    })
  })
}

exports.getAll = function(done) {
    
    
  db.get(db.READ, function(err, connection) {
    
    
    if (err) return done('Database problem')

    connection.query('SELECT * FROM comments', function (err, rows) {
    
    
      if (err) return done(err)
      done(null, rows)
    })
  })
}

exports.getAllByUser = function(userId, done) {
    
    
  db.get(db.READ, function(err, connection) {
    
    
    if (err) return done('Database problem')

    connection.query('SELECT * FROM comments WHERE user_id = ?', userId, function (err, rows) {
    
    
      if (err) return done(err)
      done(null, rows)
    })
  })
}

プロキシ接続オブジェクトを作成することもできます。これに基づいてクエリを実行し、これが書き込みか読み取りかを理解してから、適切な接続を選択します。このようにして、モジュールを変更することさえありません。

やっと

この記事のほとんどはhttps://www.terlici.com/2015/08/13/mysql-node-express.htmlから翻訳されています。間違えた場合は、メッセージを残すことができます。

おすすめ

転載: blog.csdn.net/Ser_Bad/article/details/51165906