我正在尝试使用来自sql server数据库的node.js创建Web服务,在前端,当我同时调用这两个webservices时,它会抛出错误全局连接已经存在。首先调用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;
答案 0 :(得分:34)
您必须创建poolConnection
试试这个:
new sql.ConnectionPool(config).connect().then(pool => {
return pool.request().query("")
}).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();
});
答案 1 :(得分:3)
从documentation开始,应该在连接上使用close方法,而不是在必需的模块上,
所以应该像
一样使用var connection = new sql.Connection({
user: '...',
password: '...',
server: 'localhost',
database: '...'
});
connection.close().
还有几点建议,
1.将res.send放入循环中并不是一个好主意,您可以回复整个记录集或对其进行操作,将结果存储在变量中并将其发回。
2.尝试使用promises而不是回调,它会使流程更整洁
答案 2 :(得分:2)
您必须使用ConnectionPool。
Next函数返回包含查询结果的记录集。
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();
});
});
}
我的代码工作正常!
答案 3 :(得分:1)
如果此问题仍然困扰您,请更改核心api。 转到node_modules \ mssql \ lib \ base.js 在第1723行,在if条件之前添加以下代码 globalConnection = null
答案 4 :(得分:0)
如果有人来这里试图找出如何使用带有参数的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 :(得分:0)
不要阅读他们的文档,我不认为它是由真正使用该库的人编写的:)另外,不要对事物的名称给予任何关注,“ ConnectionPool”似乎并没有真正地是任何形式的连接池。如果尝试从一个池中创建多个连接,则会收到错误消息。这是我最终可以使用的代码:
const sql = require('mssql');
let pool = new sql.ConnectionPool(config); // some object that lets you connect ONCE
let cnn = await pool.connect(); // create single allowed connection on this 'pool'
let result = await cnn.request().query(query);
console.log('result:', result);
cnn.close(); // close your connection
return result;
此代码可以并行运行多次,似乎可以创建多个连接并正确关闭它们。