5
respostas

Problema ao usar o mssql para conectar.

Estou usando mssql para conexão e funciona quando deixo conectar direto no load, porém, quando faço o wrapper da connectionFactory, nada é retornado.

/*ConnectionFactory*/
var mssql = require('mssql');

var connectionMSSQL = function () {

    var config = {
        user:'xxxx',
        password:'xxxx',
        server:'xxxxxx',
        database:'xxxx'};
    mssql.connect(config,function(err){
        if(err) console.log(err);
    });
    var request = new mssql.Request();
    return request;

}

module.exports = function(){

    return connectionMSSQL;

}



/*Em seguida tento fazer a query*/


module.exports = function(app){
/*Define o comportamento do acesso a rota ativações por get*/
app.get('/ativacoes', function(request, response){
    var connection = app.infra.connectionFactory;
        connection.query('select ati.status as STATUS,count(idAtivacao) AS ATIVACAO from TB_ATIVACOES ati' +
            ' left join TB_STAKEHOLDERS ts on ati.CPF = ts.CPF' +
            ' where ts.idPerfil =1 and ts.status =1  group by ati.status',function(err,recordset){
    /*Define a view irá renderizar a resposta*/
    response.render('ativacoes/lista',{lista:recordset});
    //response.send(recordset);
});
});
}


/*Porém, o recordset retorna vazio*/
5 respostas

Fala aí Eduardo, tudo bem?

Esses códigos estão em um arquivo só ou em arquivos separados?

Estão separados.

No arquivo que tem esse código:


/*Em seguida tento fazer a query*/


module.exports = function(app){
/*Define o comportamento do acesso a rota ativações por get*/
app.get('/ativacoes', function(request, response){
    var connection = app.infra.connectionFactory;
        connection.query('select ati.status as STATUS,count(idAtivacao) AS ATIVACAO from TB_ATIVACOES ati' +
            ' left join TB_STAKEHOLDERS ts on ati.CPF = ts.CPF' +
            ' where ts.idPerfil =1 and ts.status =1  group by ati.status',function(err,recordset){
    /*Define a view irá renderizar a resposta*/
    response.render('ativacoes/lista',{lista:recordset});
    //response.send(recordset);
});
});
}

Você está fazendo o require para importar sua fábrica de conexões ?

estou usando o load-express

  load('routes',{cwd:'app'})
        .then('infra')
        .into(app);

em infra estou carregando o módulo do mssql var mssql = require('mssql'); e no código acima chamo o module.exports com o carregamento. var connection = app.infra.connectionFactory;

Oi Eduardo, tudo bem?

Você precisa chamar a função que o express-load carregou na variável app. Da seguinte maneira:

app.infra.connectionFactory();

Seu código ficará com essa leve modificação:

/*Em seguida tento fazer a query*/


module.exports = function(app){
/*Define o comportamento do acesso a rota ativações por get*/
app.get('/ativacoes', function(request, response){

   //****** MODIFICACAO AQUI!!! ***********
    var connection = app.infra.connectionFactory();

    connection.query('select ati.status as STATUS,count(idAtivacao) AS ATIVACAO from TB_ATIVACOES ati' +
            ' left join TB_STAKEHOLDERS ts on ati.CPF = ts.CPF' +
            ' where ts.idPerfil =1 and ts.status =1  group by ati.status',function(err,recordset){
    /*Define a view irá renderizar a resposta*/
    response.render('ativacoes/lista',{lista:recordset});
    //response.send(recordset);
});
});
}

Quando você diz que ele funciona sem a função wrapper é porque o express-load carregou o módulo da "ConnectionFactory" e já chamou a função! Com isso a conexão fica disponível para você usar. Mas quando você colocou a função de embrulho, o express-load a executou no carregamento, mas com a diferença que ele deixou disponível uma função e não mais a conexão já criada. Uma função é o retorno dessa função wrapper. Como ele está retornando a função, você precisa chamá-la.

Espero ter ajudado.