在整个应用程序中使用单个数据库连接?

时间:2018-10-01 04:40:33

标签: node.js sql-server npm

我正在创建一个将通过节点js中的Udp协议进行通信的应用程序。另外,我正在使用sql server作为数据库,因此为了连接该数据库,我正在使用mssql npm liabrary。基本上我在做什么,我有一个单独的dbcon模块,如下所示

const sql = require('mssql')
const config = {
    user: 'sa',
    password: '123',
    server: '192.168.1.164', // You can use 'localhost\\instance' to connect to named instance
    database: 'SBM-EMCURE',

    options: {
        encrypt: false // Use this if you're on Windows Azure
    }
}
 sql.connect(config, err => {

 })

sql.on('error', err => {
    console.log('error on sql.on()');
})
module.exports.sql = sql;

我正在使用此导出的sql对象在dbcon模块外部运行查询,但有时会给我不同的行为,例如在执行数据库连接之前执行查询,是否有任何方法可以对整个应用程序使用单个数据库连接?使用单个数据库连接很有用,否则会减慢我的进程
预先感谢

2 个答案:

答案 0 :(得分:2)

您可以:

  • 将实例传递到每个路由器,并在设置它们时在其中使用
  • 将实例设置为app对象的属性,并在中间件函数中从req.app.sqlres.app.sql访问实例
  • 将实例设置为全局对象的属性,并可以从任何地方访问它(尽管通常不是最佳实践)

此外,在您的示例代码中,您正在通过调用sql.connect()来启动连接,但是在完成连接时不给它回调。这导致它被立即导出,并可能在实际建立连接之前被查询。这样做:

const util = require('util');
const sql = require('mssql');

const config = {
    user: 'sa',
    password: '123',
    server: '192.168.1.164', 
    database: 'SBM-EMCURE',

    options: {
        encrypt: false 
    }
};

module.exports = util.promisify(sql.connect)(config);

然后您可以使用以下方法检索实例:

const sql = await require('./database.js');

答案 1 :(得分:1)

首先,您应该创建文件database.js

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

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

module.exports = connection;

然后,您可以在server.js或任何其他文件中使用此连接。

var express = require('express');
var app = express();
var dbcon = require('./database');

app.get('/getEvent',function(req,res){
    dbcon.query('SELECT * FROM eventinfo',function(err, result) {
      if (err) throw err;
    });
});

app.listen(3000);