2
respostas

Executando query antes de conectar ao banco de dados

Estou usando MSSQL para conectar a um banco existente e quando executo:

    dbObjects.list(function(error,results){...

volta o seguinte erro:

(node:14540) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ConnectionError: Connection is closed.

Parece que não está conectando ao DB antes de executar a Query.

Código completo:

module.exports = function(app){
    app.get('/object',function(req,res){
            var connection = app.infra.connectionFactory();
            var dbObjects =  new app.infra.ObjectsDBDAO(connection);

            dbObjects.list(function(error,results){
                console.log("results: \n" + results);
                res.render('object/objectListView',{list:results});   
            });
            connection.end;
        });   
}

ObjectsDBDAO é equivalente ao ProdutoDAO construído em aula. Outra observação, quando coloco connection.end() como um método também retorna um erro.

JS ObjectDBDAO:

function ObjectsDBDAO (connection){
    this._connection = connection;
}

ObjectsDBDAO.prototype.list = function(callback){
    console.log("QUERY: SELECT * FROM tb_object");
    this._connection.query('SELECT * FROM tb_object',callback);
}

module.exports = function(connection){
   return ObjectsDBDAO;
}

JS connection factory

var sql = require('mssql');
var fs = require('fs');
var configPath = "./config.json";

var connectMSSQL = function(){
    return new sql.Connection(
        {
            user: "******",
            password: "******",
            server: "enem4fun.database.windows.net",
            port: 1433,
            database: "E4F",
            options: {
                encrypt: true
            }
        }
        );
}

module.exports = function(){
    return connectMSSQL;
}

O que pode estar dando erro?

2 respostas

OI Priscila, tudo bem? Que versão do MSSQL você está usando? Digo do pacote npm. Isso por que o ou erro se trata do não tratamento da rejeição da promisse. Você já estudou promisses no curso avançado de javascript?

Qual versão da biblioteca você está usando? De acordo com a documentação, a versão 4.x mudou drasticamente a API.

Pelo seu código, acho que você usa versão 3.x, já que não há mais o método Connection na nova versão.

A função construtora Connection, na verdade, cria um pool de conexões.

A partir desse pool e da função construtora Request, você pode criar um objeto que tem o método query.

Não há o método end. O equivalente seria o close, mas não precisa chamá-lo. A conexão é automaticamente devolvida ao pool:

Connection health check is built-in so once the dead connection is discovered, it is immediately replaced with a new one.

Com base nisso tudo, acho que basta remover o connection.end da rota e modificar a sua connectionFactory pra algo como:

var sql = require('mssql');
var pool = new sql.Connection({
            user: "******",
            password: "******",
            server: "enem4fun.database.windows.net",
            port: 1433,
            database: "E4F",
            options: {
                encrypt: true
            }
        } );

var connectMSSQL = function(){
   return new sql.Request(pool);
}

module.exports = function(){
    return connectMSSQL;
}