我正在用头撞这个图书馆。我尝试设置一个单例中间类来启动连接,然后通过静态方法共享该连接。我的问题是我很难设置一些东西,以便在运行查询时连接已经打开,但不必再次重新打开它。由于连接的打开当然是异步的,所以我不能将所有内容都放在打开回调中,因为这完全发生在另一个时间的其他地方……我唯一能做的就是mssql.Connection
分享"connecting": true
. connection.connect()
这就是为什么我不做Database.connect()
如何打开连接并在知道连接已打开的情况下继续准备语句和运行查询?
我的问题是,每当我的代码connection.connect()
从第二次开始到达时,它就会遇到错误EALREADYCONNECTING
,因为连接已经被打开。
我想过做某种 Promise 查询池,一旦连接本身通过 Promise 解决,就可以解决,但现在我的大脑非常困惑!
let mssql = require('mssql');
let fs = require('fs');
class Database
{
static connect(username, password, server, database)
{
if (Database.connection !== null) {
return Database.connection;
}
let storedUsername = null;
let storedPassword = null;
let storedServer = null;
let storedDatabase = null;
try {
fs.accessSync(__dirname + '/../../config.json');
let data = fs.readFileSync(__dirname + '/../../config.json')
data = JSON.parse(data);
storedUsername = data.sql.username;
storedPassword = data.sql.password;
storedServer = data.sql.server;
storedDatabase = data.sql.database;
} catch (e) {
// Do nothing
}
var config = {
user: username || storedUsername || '',
password: password || storedPassword || '',
server: server || storedServer || 'localhost',
database: database || storedDatabase || '',
}
Database.connection = new mssql.Connection(config);
return Database.connection;
}
static getConnection()
{
if (Database.connection === null) {
try {
Database.connect();
} catch (e) {
throw new Error('Database.getConnection: Database not connected.');
}
}
return Database.connection;
}
static getInstance()
{
return mssql;
}
static query(query, fields)
{
if (typeof query !== 'string' || typeof fields !== 'object') {
throw new Error("Invalid parameters");
}
let db = Database.getInstance();
let connection = Database.getConnection();
let ps = new db.PreparedStatement(connection);
let values = {};
fields.forEach(function(current, index) {
ps.input(current.name, current.type);
values[current.name] = current.value;
});
connection.connect(function(err) {
if (err) {
throw err;
}
ps.prepare(query, function(err) {
if (err) {
throw new Error(err);
}
ps.execute(values, function(err, recordset, affected) {
if (err) {
ps.unprepare(function(err) {
if (err) {
throw new Error(err);
}
});
throw new Error(err);
}
ps.unprepare(function(err) {
if (err) {
throw new Error(err);
}
});
});
});
});
}
}
Database.connection = null;
module.exports = Database;