node.js全局连接已存在。首先调用sql.close()

时间:2017-06-25 09:19:45

标签: sql-server node.js angular web-services

我正在尝试使用来自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;

6 个答案:

答案 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;

此代码可以并行运行多次,似乎可以创建多个连接并正确关闭它们。