使用Node.js MySQL库的正确方法是什么?

时间:2018-05-23 07:58:59

标签: javascript mysql node.js

目前我正在使用Node.js中的MySQL库,但我对使用此库的正确/最有效方法有疑问。

根据w3schools,制作单个查询的正确方法是使用这样的代码

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});

然而,假设我想进行多个查询,这些查询将由事件执行,例如我将如何处理?我应该创建一个“初始化”函数,该函数会在程序运行时立即执行吗?

var mysql = require('mysql');

var database;

//Initialise database
function setupDatabase() {
    database = mysql.createConnection({ 
        host: token.host,
        user: token.user,
        password: token.password,
        database: token.database,
        port: token.port
    });
}

//Imagine this could be called at any time after execution
function event() {
    if(database != null) {
        database.connect(function(err) {
            if (err) throw err;
            database.query("SELECT * FROM customers", function (err, result, fields) {
                if (err) throw err;
                console.log(result);
            });
        });
    }
}

每次进行查询时都必须连接数据库,还是可以将“database.connect”调用添加到我的setupDatabase函数中?

var mysql = require('mysql');

var database;

//Initialise database
function setupDatabase() {
    database = mysql.createConnection({ 
        host: token.host,
        user: token.user,
        password: token.password,
        database: token.database,
        port: token.port
    });

    if(database != null) {
        database.connect(function(err) {
            if (err) throw err;
        });
    }
}

//Imagine this could be called at any time after execution
function event() {
    if(database != null) {
        database.query("SELECT * FROM customers", function (err, result, fields) {
            if (err) throw err;
            console.log(result);
        });
    }
}

我主要担心的是每次进行查询时调用con.connect函数都会很慢,尽管这些是异步的,但我希望能够使用正确/最有效的方法。在最后两个代码片段中,我可以随时纠正我的任何错误。到目前为止,我只测试了第一个代码片段。

2 个答案:

答案 0 :(得分:3)

每个应用程序实时只需要建立一次数据库连接(除非你有断开连接)。然后,您可以根据需要获得尽可能多的查询。

只需将数据库连接例程放在sepparate文件中,然后在应用程序初始化步骤中将其命名。

// mysql.js
const mysql = require('mysql');
module.exports = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

或者在需要数据库连接的任何地方需要它 - 它将返回连接的数据库对象,而不会一次又一次地重新运行该代码。

// inex.js
const databse = require('./mysql')
database.query("SELECT * FROM customers")

答案 1 :(得分:1)

我创建了一个文件,其中包含一个包含池的函数,并像这样处理与数据库的连接

let _this = {};
let POOL = null;

function getPool() {
    return new Promise((resolve, reject) => {
        if(POOL != null) {
            resolve(POOL);
        } else {
            //create connection pool
            POOL = connectionPool;
            resolve(POOL);
        }
    });
}

function closePool(){
    // close pool here
}

_this.getPool = getPool;
_this.closePool = closePool;

module.exports = _this;

现在,您可以致电getPool()并重新获取可以执行查询的连接池。