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
'source' 카테고리의 다른 글
TypeScript: 빈 유형의 컨테이너 어레이 생성 (0) | 2022.09.23 |
---|---|
SELECT * FROM table_name\G에 \G가 표시되는 이유는 무엇입니까? (0) | 2022.09.23 |
constructor type 인수가 type 앞에 배치되는 것은 무엇을 의미합니까? (0) | 2022.09.23 |
Python 판다를 사용한 모든 복제품 목록은 어떻게 얻을 수 있나요? (0) | 2022.09.23 |
php 문자열 연결, 성능 (0) | 2022.09.23 |