Контроль транзакций и подключений в node.js sql - PullRequest
0 голосов
/ 30 мая 2020

приведенный ниже код выполняет серию запросов на сервере sql, но когда я запускаю код, я получаю следующую ошибку: ConnectionError: соединение закрыто. соединение с сервером sql открыто однако, что вызывает эту ошибку? соединение открывается с помощью sql -сервера с параметрами конфигурации сервера, одна и та же транзакция должна выполнять несколько запросов

Node.js Код:

async function invioRapportino(FilePDf, IdRapporto, IdUtente, NumeroDocumento, IdCantiere) {

    var check = true;
    const EmailClienti = await EmailInvioRapportino(IdCantiere);
    //Fase 1: Genero il file pdf nel filesystem
    var bin = Buffer.from(FilePDf, 'base64');
    var nomeDocumentoTemporaneo = "./rapportino.pdf";
    await fs.writeFile(nomeDocumentoTemporaneo, bin, error => {
        if (error) {
            check = false;
            ManageError.SendError("Rapportino.js Controller: errore generazione file pdf ")
        }
    });

    if (check == true) {
        //Fase 2: procedo con l'inserimento degli articoli e del documento nel cantiere
        var conn=await sql.connect(DbConfig.config);
        const transaction = new sql.Transaction(conn).begin();
        //transaction.begin();
        var check = false;
        try {
            //Query che esegue l'inserimento del rapportino all'interno del db
            var request = new sql.Request(transaction);
            request.input("Immagine", sql.VarBinary, FilePDf);
            request.input("IdRapporto", sql.VarBinary, IdRapporto);
            await request.query("Update Rapporto set Immagine=@Immagine where IdRapporto=@IdRapporto");
            //Carico inserisco e ristoranti nel rapportino
            var ristorantiRapportini = await caricamentoRistorante(IdRapporto);
            for (var i = 0; i < ristorantiRapportini.length; i++) {
                var request = new sql.Request(transaction);
                request.input("IdCantiere", sql.Int, IdCantiere);
                request.input("ExtraPreventivo", sql.Int, 0);
                request.input("RagioneSociale", sql.VarChar, ristorantiRapportini.RagioneSociale);
                request.input("Data", sql.VarChar, ristorantiRapportini.Data);
                request.input("Costo", sql.Money, ristorantiRapportini.Costo);
                request.input("IdUtenteInserimento", sql.Int, IdUtente);
                await request.query("insert into Ristorante(IdCantiere,ExtraPreventivo,RagioneSociale,Data,Costo,IdUtenteInserimento) values(@IdCantiere,@ExtraPreventivo,@RagioneSociale,@Data,@Costo,@IdUtenteInserimento)");
            }
            transaction.commit();
            check = true;
        } catch (err) {
            ManageError.SendError("Errore: Inserimento rapportino Errore esecuzione query: " + err)
            (await transaction).rollback();
        }
        if (check == true) {
            //Fase 3: procedo a recuperare gli indirizzi emaila cui inviare il file PDF
            var StringEmail = "";
            for (var i in EmailClienti) {
                var Email = EmailClienti[i].Email;
                StringEmail = StringEmail + "" + EmailClienti[i].Email + ",";
            }
            StringEmail = StringEmail + "laura@asas.com";

            nodemailer.createTestAccount((err, account) => {
                if (err) {
                    console.log("Rapportino.js Controller: Errore invio email ");
                    ManageError.SendError("Rapportino.js Controller: Errore invio email " + err);
                    check = false;
                }
                //Imposto il modulo per l'invio delle email
                let transporter = nodemailer.createTransport({
                    host: "authsmtp.securemail.pro",
                    port: 465,
                    secure: true,
                    auth: {
                        user: "smtp@ss.com",
                        pass: "ssss@"
                    }
                });

                //Impostazione della configurazione dell'email per l'invio del file
                let mailOptions = {
                    from: '"ss sss',
                    to: StringEmail,
                    subject: "Rapportino N° " + NumeroDocumento,
                    text: "Rapportino N° " + NumeroDocumento,
                    html: "",
                    attachments: [{
                        path: nomeDocumentoTemporaneo
                    }]
                };

                //Se l'Email viene inviata corettamente il rapportino viene registrato nel database
                transporter.sendMail(mailOptions, (error, info) => {
                    if (error) {
                        check = false;
                        ManageError.SendError("Errore invio email: " + error);
                        console.log("Errore invio email: " + error);
                    }
                    //Eliminazione del file temporaneo
                    fs.unlink(nomeDocumentoTemporaneo, function(err) {
                        if (err) {
                            console.log("Errore eliminazione file temporaneo: ", err);
                        }
                    });
                });
            });
        }
    }

    return check;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...