2017-06-25 3 views
3

SQL Serverデータベースからnode.jsを使用してWebサービスを作成しようとしていますが、フロントエンドで2つのWebサービスを同時に呼び出すと同時にエラーが発生しますグローバル接続がすでに存在します。最初にsql.close()を呼び出します。node.jsグローバル接続はすでに存在します。まずはsql.close()を呼び出してください

解決策はありますか? documentationから

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; 

答えて

8

すっきり流れになるだろう:あなたはのConnectionPoolを使用する必要があります

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

ありがとう、完璧に私のために働いた –

2

、closeメソッドもそう

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

提案のカップル、
のように使用する必要があります

、接続ではなく、必要なモジュールで使用する必要があります1. res.sendをループに入れておくのは良い考えではありません。レコードセット全体を返信したり、操作を行ったり、結果を変数に格納して返すことができます。
2.代わりにコールバックのpromisesを使用してみてください、それはあなたがこの試すpoolConnection を作成する必要が

+0

アプリケーションのユーザーがログインページからデータベースに接続されていないため、IPアドレスとパスワードを指定してデータベースを選択する必要があります。 –

+0

上記の接続オブジェクトには、要求に含まれる資格情報を渡すことができます。 – Shivam

+0

例をどのように指定できますか? –

0

を。

次の関数は、クエリ結果を含むレコードセットを返します。私のコードで

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

 

 
}

作品罰金!

関連する問題