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



我正在创建一个应用程序,该应用程序将通过节点js中的Upp协议进行通信。此外,我正在使用sql服务器作为数据库,因此为了连接此数据库,我正在使用mssqlnpm 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 模块之外运行我的查询,但它有时会给我不同的行为,例如在 databse 连接之前执行查询,有没有办法对整个应用程序使用单个数据库连接?使用单个数据库连接很有用,否则会减慢我的过程
提前谢谢

你可以:

  • 将实例传递到每个路由器中,并在设置它们时在那里使用它
  • 将实例设置为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');

首先你应该创建文件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);

node js require 每次需要时都会返回一个模块的相同实例,来自 [Node.js docs]

"every call to require('foo') will get exactly the same object returned, if it would resolve to the same file."

让我们创建一个名为 dbconn 的数据库包装器文件.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;

在任何文件中,您都可以只要求数据库包装器 js 并获得相同的连接

var dbcon = require('./dbconn');
dbcon.query('SELECT * FROM eventinfo',function(err, result) {
if (err) throw err;
});

最新更新