2017-04-11 14 views
7

Hi Tworzę węzeł js spokojny api przy użyciu bazy danych sqlserver, przygotowuję get api, kiedy używam tego wyjścia api jest pokazany w formacie json, a odświeżam, że przeglądarka zyskuje swoje pokazy "Błąd: globalny połączenie już istnieje Wywołaj najpierw sql.close(). "error. Dodaję kodBłąd: Globalne połączenie już istnieje. Zadzwoń do sql.close() najpierw

var express = require("express"); 
 

 
var sql = require("mssql"); 
 
var app = express(); 
 

 
//Initiallising connection string 
 
var dbConfig = { 
 
    user: 'sa', 
 
    password: 'India123', 
 
    server: 'localhost', 
 
    database: 'sample' 
 

 
    
 
}; 
 

 
app.get('/login', function (req, res) { 
 

 
    // connect to your database 
 
    
 
    var data = { 
 

 
     "user": "" 
 
    }; 
 
    sql.connect(dbConfig, function (err) { 
 

 
     if (err) console.log(err); 
 

 
    
 
     var request = new sql.Request(); 
 
    
 
     
 
     request.query('select * from Login', function (err, result) { 
 

 
      if (err) console.log(err) 
 

 
      // send data as a response 
 
      //res.send(result.recordset); 
 
      data["user"] = result.recordset; 
 
      res.send(data); 
 
      
 
     
 
     }); 
 
    }); 
 

 
}); 
 

 
var server = app.listen(5000, function() { 
 
    console.log('Server is running..'); 
 
});
proszę mnie poprawić kod. Dzięki wcześniejszym

+0

Czy to dzieje się na pierwszy na drugiej instancji? Pierwsza instancja nie zamyka połączenia, które spowodowałoby awarię drugiej instancji. Nie mam pojęcia, co się dzieje, jeśli w pierwszej kolejności nie działa. – cup

Odpowiedz

5
// db.js 
var mssql = require("mssql"); 
var dbConfig = { 
    user: 'sa', 
    password: 'India123', 
    server: 'localhost', 
    database: 'sample' 
}; 

var connection = mssql.connect(dbConfig, function (err) { 
    if (err) 
     throw err; 
}); 

module.exports = connection; 

// app.js 
var db = require("db"); 
var express = require("express"); 
var app = express(); 

app.get('/login', function (req, res, next) { 
    var request = new db.Request(); 
    request.query('select * from Login', function (err, result) { 
     if (err) 
      return next(err); 

     var data = {}; 
     data["user"] = result.recordset; 
     res.send(data);  
    }); 
}); 

var server = app.listen(5000, function() { 
    console.log('Server is running..'); 
}); 
+0

Dzięki Aikon Mogwai ... działa dobrze ... możesz wyjaśnić, jakie zmiany dokładnie zrobiłeś? –

+0

Tworzysz połączenie za każdym razem, gdy przeglądarka wyświetla stronę (i garbage collect musi ją zniszczyć po zapytaniu). To nie jest dobre, ponieważ ta operacja wymaga czasu procesora. Gdy aplikacja zawiera 'db.js', wtedy połączenie utwórz raz i będzie dostępne dla wszystkich modułów. –

+1

To jest lekko wyłączone. Twoje module.exports powinno być mssql w db.js. Powodem jest to, że tworzysz nowe żądanie na mssql, a nie na połączenie. – DevShadow

1

Nie używaj sql.Connection() dłużej, zamiast korzystania sql.ConnectionPool()

Połączenia

Wewnętrznie, każda instancja pula połączeń jest oddzielna pula połączeń TDS . Po utworzeniu nowego żądania/transakcji/przygotowanego wyciągu, nowe połączenie TDS jest pobierane z puli i zarezerwowane dla pożądanego działania. Po zakończeniu działania połączenie zostaje zwolnione z powrotem do puli. Sprawdzanie poprawności połączenia jest wbudowane, więc po znalezieniu martwego połączenia jest ono natychmiast zastępowane nowym.

WAŻNE: Zawsze dołącz odbiornik błędów do utworzonego połączenia. Ilekroć coś pójdzie nie tak z połączeniem, wyemituje błąd i jeśli nie będzie słuchacza, spowoduje awarię aplikacji z nieprzechwyconym błędem.

Utwórz pulę i użyj połączenia.

const pool = new sql.ConnectionPool({ /* config */ })

Entire Article how to use pool and close pool.

https://www.npmjs.com/package/mssql

var sql = require("mssql"); 

const pool = new sql.ConnectionPool({ 
    user: 'sa', 
    password: '[email protected]', 
    server: 'SAI-PC', 
    database: 'Demo' 
}) 


var conn = pool; 

conn.connect().then(function() { 
    var req = new sql.Request(conn); 
    req.query("SELECT * FROM Product").then(function (recordset) { 
     console.log(recordset); 
     conn.close(); 
    }) 
     .catch(function (err) { 
      console.log(err); 
      conn.close(); 
     }); 
}) 
    .catch(function (err) { 
     console.log(err); 
    }); 
Powiązane problemy