source

nodejs의 단일 파일에 mysql 데이터베이스 연결을 제공하는 방법

factcode 2022. 9. 23. 00:04
반응형

nodejs의 단일 파일에 mysql 데이터베이스 연결을 제공하는 방법

모듈의 mysql 연결을 제공해야 합니다.난 이런 코드가 있어

var express = require('express'),
app = express(),
server = require('http').createServer(app);

var mysql      = require('mysql');
var connection = mysql.createConnection({
    host     : '127.0.0.1',
    user     : 'root',
    password : '',
    database    : 'chat'
});

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

app.get('/save', function(req,res){
    var post  = {from:'me', to:'you', msg:'hi'};
    var query = connection.query('INSERT INTO messages SET ?', post, function(err, result) {
        if (err) throw err;
    });
});

server.listen(3000);

단, 모든 모듈에 대해 단일 mysql 연결을 제공하는 방법.

DB 래퍼 작성 후 필요할 수 있습니다.노드의 require는 매번 같은 모듈의 인스턴스를 반환하므로 연결을 수행하고 핸들러를 반환할 수 있습니다.Node.js 문서에서 다음을 수행합니다.

require'foo')에 대한 모든 콜이 동일한 파일로 해결되면 정확히 동일한 오브젝트를 반환합니다.

생성할 수 있습니다.db.js:

var mysql = require('mysql');
var connection = mysql.createConnection({
    host     : '127.0.0.1',
    user     : 'root',
    password : '',
    database : 'chat'
});

connection.connect(function(err) {
    if (err) throw err;
});

module.exports = connection;

그럼 네 안에app.js, 당신은 단지 그것을 필요로 할 것입니다.

var express = require('express');
var app = express();
var db = require('./db');

app.get('/save',function(req,res){
    var post  = {from:'me', to:'you', msg:'hi'};
    db.query('INSERT INTO messages SET ?', post, function(err, result) {
      if (err) throw err;
    });
});

server.listen(3000);

이 접근방식을 사용하면 접속 세부사항을 추상화하고 기타 필요한 정보를 랩할 수 있습니다.db노드 요구의 동작에 의해, db에의 접속을 1개 유지하면서, 애플리케이션 전체에 걸쳐 실시합니다.

Sean3z와 비슷한 어프로치를 취했지만, 그 대신 문의할 때마다 접속을 종료합니다.

앱의 시작점에서만 실행되는 경우 이 방법은 작동하지만, 예를 들어 컨트롤러가 있다고 가정해 보겠습니다.var db = require('./db')그렇지 않으면 컨트롤러에 액세스할 때마다 새 연결이 생성되기 때문입니다.

이를 피하기 위해서는 매번 연결을 열고 닫는 것이 안전하다고 생각합니다.

여기 제 코드의 일부분이 있습니다.

mysq_mysq.mysq.mysq.myslog

// Dependencies
var mysql   = require('mysql'),
    config  = require("../config");

/*
 * @sqlConnection
 * Creates the connection, makes the query and close it to avoid concurrency conflicts.
 */
var sqlConnection = function sqlConnection(sql, values, next) {

    // It means that the values hasnt been passed
    if (arguments.length === 2) {
        next = values;
        values = null;
    }

    var connection = mysql.createConnection(config.db);
    connection.connect(function(err) {
        if (err !== null) {
            console.log("[MYSQL] Error connecting to mysql:" + err+'\n');
        }
    });

    connection.query(sql, values, function(err) {

        connection.end(); // close the connection

        if (err) {
            throw err;
        }

        // Execute the callback
        next.apply(this, arguments);
    });
}

module.exports = sqlConnection;

아무데나 쓸 수 있는 게 아니라

var mysql_query = require('path/to/your/mysql_query');
mysql_query('SELECT * from your_table where ?', {id: '1'}, function(err, rows)   {
    console.log(rows);
});

갱신: config.json의 외관

{
        "db": {
        "user"     : "USERNAME",
        "password" : "PASSWORD",
        "database" : "DATABASE_NAME",
        "socketPath": "/tmp/mysql.sock"
    }
}

이게 도움이 됐으면 좋겠다.

단일 연결을 공유하는 것이 아니라 연결 풀을 사용하는 것이 좋다고 생각합니다.여기서 확인할 수 있듯이 연결 풀을 사용하면 성능이 훨씬 향상됩니다.

라이브러리 설명서에서 설명한 바와 같이 MySQL 프로토콜이 순차적이기 때문에 발생합니다(즉, 쿼리를 병렬로 실행하려면 여러 연결이 필요합니다).

접속 풀 문서

node.js 문서에서 "모듈에서 코드를 여러 번 실행하고 함수를 내보내고 해당 함수를 호출하려면 node.js module.export를 사용하여 단일 파일을 사용하여 DB 연결을 관리할 수 있습니다.자세한 내용은 Node.js 설명서를 참조하십시오.db.js 파일은 다음과 같습니다.

    const mysql = require('mysql');

    var connection;

    module.exports = {

    dbConnection: function () {

        connection = mysql.createConnection({
            host: "127.0.0.1",
            user: "Your_user",
            password: "Your_password",
            database: 'Your_bd'
        });
        connection.connect();
        return connection;
    }

    };

그런 다음 연결을 사용하는 파일은 useDb.js와 같을 수 있습니다.

const dbConnection = require('./db');

var connection;

function callDb() {

    try {

        connection = dbConnectionManager.dbConnection();

        connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
            if (!error) {

                let response = "The solution is: " + results[0].solution;
                console.log(response);

            } else {
                console.log(error);
            }
        });
        connection.end();


    } catch (err) {
        console.log(err);
    }
}
var mysql = require('mysql');

var pool  = mysql.createPool({
    host     : 'yourip',
    port    : 'yourport',
    user     : 'dbusername',
    password : 'dbpwd',
    database : 'database schema name',
    dateStrings: true,
    multipleStatements: true
});


// TODO - if any pool issues need to try this link for connection management
// https://stackoverflow.com/questions/18496540/node-js-mysql-connection-pooling

module.exports = function(qry, qrytype, msg, callback) {

if(qrytype != 'S') {
    console.log(qry);
}

pool.getConnection(function(err, connection) {
    if(err) {
        if(connection)
            connection.release();
        throw err;
    } 

    // Use the connection
    connection.query(qry, function (err, results, fields) {
        connection.release();

        if(err) {
            callback('E#connection.query-Error occurred.#'+ err.sqlMessage);    
            return;         
        }

        if(qrytype==='S') {
            //for Select statement
            // setTimeout(function() {
                callback(results);      
            // }, 500);
        } else if(qrytype==='N'){
            let resarr = results[results.length-1];
            let newid= '';
            if(resarr.length)               
                newid = resarr[0]['@eid'];
            callback(msg + newid);
        } else if(qrytype==='U'){
            //let ret = 'I#' + entity + ' updated#Updated rows count: ' + results[1].changedRows;
            callback(msg);                      
        } else if(qrytype==='D'){
            //let resarr = results[1].affectedRows;
            callback(msg);
        }
    });

    connection.on('error', function (err) {
        connection.release();
        callback('E#connection.on-Error occurred.#'+ err.sqlMessage);   
        return;         
    });
});

}

이거 먹어봐

var express = require('express');

var mysql     =    require('mysql');

var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
console.log(app);
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "admin123",
  database: "sitepoint"
});

con.connect(function(err){
  if(err){
    console.log('Error connecting to Db');
    return;
  }
  console.log('Connection established');
});



module.exports = app;

전역 변수를 만든 다음 다른 파일에서 해당 변수에 액세스할 수 있습니다.

이것은 내 코드입니다. 나는 db.js라는 MySQL 데이터베이스 연결을 위한 별도의 파일을 만들었습니다.

const mysql = require('mysql');

var conn = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "xxxxx",
    database: "test"
});

conn.connect((err) => {
    if (err) throw err;
    console.log('Connected to the MySql DB');
});

module.exports = conn;

그런 다음 app.js 파일에서

const express = require('express');
const router = express.Router();

// MySql Db connection and set in globally
global.db = require('../config/db');

이제 다른 파일에서도 사용할 수 있습니다.

const express = require('express');
const router = express.Router();

router.post('/signin', (req, res) => {
    try {
        var param = req.body;
        var sql = `select * from user`;

        // db is global variable
        db.query(sql, (err, data) => {
            if (err) throw new SyntaxError(err);
            res.status(200).json({ 'auth': true, 'data': data });
        });
    } catch (err) {
        res.status(400).json({ 'auth': false, 'data': err.message });
    }
});

언급URL : https://stackoverflow.com/questions/30545749/how-to-provide-a-mysql-database-connection-in-single-file-in-nodejs

반응형