Как обеспечить соединение базы данных mysql в одном файле в nodejs
Мне нужно предоставить 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-соединение для всех модулей.
Ответы
Ответ 1
Вы можете создать оболочку db, а затем потребовать ее. node требует возврата одного и того же экземпляра модуля каждый раз, поэтому вы можете выполнить свое соединение и вернуть обработчик. Из Node.js docs:
каждый вызов 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, благодаря тому, как node требует работы:)
Ответ 2
Я использовал аналогичный подход, как Sean3z, но вместо этого я закрыл соединение каждый раз, когда делаю запрос.
Его способ работает, если он выполняется только в точке входа вашего приложения, но пусть у вас есть контроллеры, которые вы хотите сделать var db = require('./db')
. Вы не можете, потому что иначе каждый раз, когда вы получаете доступ к этому контроллеру, вы будете создавать новое соединение.
Чтобы этого избежать, я считаю, что безопаснее, на мой взгляд, открывать и закрывать соединение каждый раз.
Вот фрагмент моего кода.
mysq_query.js
// 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"
}
}
Надеюсь, что это поможет.
Ответ 3
попробуйте это
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;
Ответ 4
Из документации node.js: "Чтобы модуль выполнял код несколько раз, экспортировал функцию и вызвал эту функцию", вы можете использовать node.js module.export и иметь один файл для управления db connections. Вы можете найти более подробную информацию в 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);
}
}