node.js Глобальное соединение уже существует. Сначала вызовите sql.close()
Я пытаюсь создать веб-службы, используя node.js из базы данных SQL Server, в интерфейсе, когда я вызываю эти 2 веб-службы одновременно, он вызывает ошибку. Глобальное соединение уже существует. Сначала вызовите sql.close().
Любое решение?
var express = require('express');
var router = express.Router();
var sql = require("mssql");
router.get('/Plant/:server/:user/:password/:database', function(req, res, next) {
user = req.params.user;
password = req.params.password;
server = req.params.server;
database = req.params.database;
// config for your database
var config = {
user: user,
password: password,
server: server,
database:database
};
sql.connect(config, function (err) {
// create Request object
var request = new sql.Request();
// query to the database and get the records
request.query("SELECT distinct PlantName FROM MachineryStateTable"
, function (err, recordset) {
if (err) console.log(err)
else {
for(i=0;i<recordset.recordsets.length;i++) {
res.send(recordset.recordsets[i])
}
}
sql.close();
});
});
});
router.get('/Dep/:server/:user/:password/:database/:plantname', function(req, res, next) {
user = req.params.user;
password = req.params.password;
server = req.params.server;
database = req.params.database;
plantname = req.params.plantname;
// config for your database
var config = {
user: user,
password: password,
server: server,
database:database
};
sql.connect(config, function (err) {
// create Request object
var request = new sql.Request();
// query to the database and get the records
request.query("SELECT distinct DepName FROM MachineryStateTable where PlantName= '"+plantname+"'"
, function (err, recordset) {
if (err) console.log(err)
else {
for(i=0;i<recordset.recordsets.length;i++) {
res.send(recordset.recordsets[i])
}
sql.close();
}
});
});
});
module.exports = router;
Ответы
Ответ 1
Вы должны создать poolConnection
попробуйте это:
new sql.ConnectionPool(config).connect().then(pool => {
return pool.request().query("SELECT * FROM MyTable")
}).then(result => {
let rows = result.recordset
res.setHeader('Access-Control-Allow-Origin', '*')
res.status(200).json(rows);
sql.close();
}).catch(err => {
res.status(500).send({ message: '${err}'})
sql.close();
});
Ответ 2
Из документации следует использовать метод close для соединения, а не на требуемом модуле,
Поэтому следует использовать как
var connection = new sql.Connection({
user: '...',
password: '...',
server: 'localhost',
database: '...'
});
connection.close().
Также пара предложений,
1. Постановка res.send в цикле - не очень хорошая идея. Вы можете ответить на все записи или выполнить над ним операции, сохранить результирующий переменный и отправить его обратно.
2. Попробуйте использовать обещания, вместо обратных вызовов, это сделает поток опережающим
Ответ 3
Вы должны использовать ConnectionPool.
Следующая функция возвращает набор записей с результатами моих запросов.
async function execute2(query) {
return new Promise((resolve, reject) => {
new sql.ConnectionPool(dbConfig).connect().then(pool => {
return pool.request().query(query)
}).then(result => {
resolve(result.recordset);
sql.close();
}).catch(err => {
reject(err)
sql.close();
});
});
}
Ответ 4
В случае, если кто-то приходит сюда, пытаясь выяснить, как использовать соединение с пулом SQL Server с параметрами:
var executeQuery = function(res,query,parameters){
new sql.ConnectionPool(sqlConfig).connect().then(pool =>{
// create request object
var request = new sql.Request(pool);
// Add parameters
parameters.forEach(function(p) {
request.input(p.name, p.sqltype, p.value);
});
// query to the database
request.query(query,function(err,result){
res.send(result);
sql.close();
});
})
}
Ответ 5
если эта проблема все еще беспокоит вас, измените основной API.
перейти к node_modules\mssql\lib\base.js
в строке 1723 добавьте код ниже, если условие
globalConnection = null