node.js sql中的事务和连接控制

dwbf0jvd  于 2021-08-13  发布在  Java
关注(0)|答案(0)|浏览(211)

下面的代码在SQLServer上执行一系列查询,但是当我运行代码时,我有以下内容error:connectionerror:连接已关闭。与sql server的连接已打开,但是,是什么原因导致此错误?使用带有服务器配置参数的sql server打开连接时,同一事务必须执行多个查询
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;
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题