Łączenie się z SQL Server przy użyciu promise

0

Cześć.
Udało mi się wykonać zapytanie na basie SQL Server.
Niestety żeby uzyskać użyłem setTimeout ustawione na arbitralny czas.
Chciałbym wykonać zapytanie tak szybko jak tylko połączenie z bazą zostanie ustanowione.
Najlepiej przy użyciu promise.
Co można poprawić w tym kodzie:

    var Connection = require('tedious').Connection;  
    var config = {  
        server: 'DESKTOP-XYZ',  
        authentication: {
            type: 'default',
            options: {
                userName: 'node', 
                password: '123456'  
            }
        },
        options: {
            encrypt: false,
            database: 'test'
        }
    };  
    var connection = new Connection(config);  
    connection.on('connect', function(err) {  
        if (err) {console.log(err)} else {
            console.log('connected')
        }
         
    });
    
    function connectToSQL() {
        return new Promise((resolve, reject) => {
            connection.connect();
            setTimeout(()=>{resolve()}, 100)
        })
    }

    var Request = require('tedious').Request;  
    var TYPES = require('tedious').TYPES;  
  
    function executeStatement() {  
        const request = new Request("SELECT * FROM dbo.users", function(err) {  
        if (err) {  
            console.log(err);}  
        });  
        var result = "";  
        request.on('row', function(columns) {  
            columns.forEach(function(column) {  
              if (column.value === null) {  
                console.log('NULL');  
              } else {  
                result+= column.value + " ";  
              }  
            });  
            console.log(result);  
            result ="";  
        });  
  
        request.on('done', function(rowCount, more) {  
        console.log(rowCount + ' rows returned');  
        });  
        
        request.on("requestCompleted", function (rowCount, more) {
            connection.close();
        });
        connection.execSql(request);  
    }  

connectToSQL()
.then(executeStatement)

?

1
  function connectToSQL() {
        return new Promise((resolve, reject) => {
            connection.connect();
            setTimeout(()=>{resolve()}, 100)
        })
    }

czy biblioteka, z której korzystasz, nie ma jakiejś opcji do ustawiania timeouta?
Tu coś piszą o tym: http://tediousjs.github.io/tedious/api-connection.html
np. jest tam coś options.connectTimeout i inne.

var Connection = require('tedious').Connection;  
(...)
var Request = require('tedious').Request;  
var TYPES = require('tedious').TYPES;  

To się robi inaczej. Najpierw się importuje, a nie woła za każdym razem require:

var tedious = require('tedious');
var Connection = tedious.Connection;  
(...)
var Request = tedious.Request;  
var TYPES = tedious.TYPES;  

no i jeszcze można dać kolejne usprawnienia jak zrobienie tego na const (varów się w zasadzie nie powinno już używać, poza uzasadnionymi przypadkami) oraz użycie destrukturingu i nam się to skróci do 1 linijki:

const { Connection, Request, TYPES } = require('tedious');

plus można by zamienić require na import z ES6, ale to mogłoby od ciebie wymagać zmian w konfiguracji projektu.

Chciałbym wykonać zapytanie tak szybko jak tylko połączenie z bazą zostanie ustanowione.

Przecież łapiesz już on('connect'), tylko że nie reagujesz na połączenie poza wypisaniem tego na konsoli.

0

Przyznam że bezczelnie przekopiowałem z samouczka Microsoftu: https://learn.microsoft.com/en-us/sql/connect/node-js/step-3-proof-of-concept-connecting-to-sql-using-node-js?view=sql-server-ver16 i tylko usunąłem komentarze.

Stąd te vary, brak destrukturingu i podwójne require (Swoją drogą require ma w sobie cashe więc nie powinno być różnicy wydajnościowo).

Tak. Wystarczyło podpiąć funkcję pod on.

1 użytkowników online, w tym zalogowanych: 0, gości: 1