web-dev-qa-db-ja.com

node.jsグローバル接続はすでに存在します。最初にsql.close()を呼び出します

私はフロントエンドでこれらの2つのWebサービスを同時に呼び出すと、グローバル接続がすでに存在しているというエラーをスローするので、SQLサーバーデータベースからnode.jsを使用してWebサービスを作成しようとしています。最初に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;
18
Laamiri Oussema

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();
  });
40
bams

documentation から、必要なモジュールではなく接続でcloseメソッドを使用する必要があります。

のように使用する必要があります

var connection = new sql.Connection({
user: '...',
password: '...',
server: 'localhost',
database: '...'
});
connection.close().

また、いくつかの提案、
1。 res.sendをループに入れるのは良い考えではありません。レコードセット全体を返信するか、レコードセットに対して操作を行い、結果を変数に保存して送信することができます。
2。コールバックの代わりに promises を使用してみてください。フローがきれいになります。

3
Shivam

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();
        });
    });


}

私のコードではうまくいきます!

それでもこの問題が気になる場合は、コアAPIを変更してください。 node_modules\mssql\lib\base.jsの行1723に移動し、条件globalConnection = nullの場合、前に以下のコードを追加します

0
Mohammed Sabbir

誰かがここに来て、パラメーターを使用して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();

    });
 })       
} 
0
Jared