【问题标题】:loosing connection to sql server from express js api从 express js api 失去与 sql server 的连接
【发布时间】:2022-02-02 17:51:30
【问题描述】:

我正在构建这个 api,它从数据库获取数据并将数据发布到位于同一服务器上的另一个数据库,但是当我第一次运行应用程序时,我似乎遇到了连接问题,一切正常,但在进行了一些 api 调用之后它只是崩溃并且不再起作用我的猜测是连接没有被关闭

这是我的配置文件,还有一个类似的文件,但使用不同的数据库

const config = {
    user :'user',
    password :'pass',
    server:'sqlserver',
    database:'Stock',
    options:{
        trustedconnection: true,
        enableArithAbort : true, 
    },
    port : 1433
}

这些代码为 2 个数据库准备连接池

async function connectStock() {
  const pool = new sql.ConnectionPool(config);
  try {
      await pool.connect();
      console.log('Connected to database : ',config);
      return pool;
  }
  catch(err) {
      console.log('Database connection failed!', err);
      return err;
  }
}

async function connectExpiry() {
  const pool = new sql.ConnectionPool(configInsert);
  try {
      await pool.connect();
      console.log('Connected to database : ',configInsert);
      return pool;
  }
  catch(err) {
      console.log('Database connection failed!', err);
      return err;
  }
}

这是我获取数据的方式

const getInvoiceDetails = async (request, response, Y_FAC, N_FAC) => {
  try {
    //const pool = await sql.connect(config);
    let DB = await connectStock()
    let q =
      "select m.CODE_ART,a.a_code,a.DESC_ART,m.NB_CAISS,sum((m.QCAISSE * m.NB_CAISS) + m.QPIECE + m.MORE_FREE + m.QTY_XTRA) as 'TotalPc' ";
    q +=
      " from cli_fac f inner join cli_mvt m on f.Y_FAC = m.y_fac and f.n_fac = m.n_fac";
    q +=
      " inner join article a on a.code_art = m.CODE_ART where  m.TRANS_TYPE = 'FA'";
    q +=
      " and f.Y_FAC = '" +
      Y_FAC +
      "' and f.N_FAC = '" +
      N_FAC +
      "' group by m.CODE_ART,m.NB_CAISS,a.a_code,a.DESC_ART";  
    console.log("query get in details ", q);
    //const invoicesDet = await pool.query(q);
    const invoicesDet = await DB.query(q);
    return invoicesDet.recordsets;
  } catch (err) {
    console.log("error get inv det " + err.message);
  }
  finally {
    DB.close();
}
};

这就是我如何进行 api 调用

router.route('/InvoicesFAC/:Y_FAC/:N_FAC').get((req,res)=>{
   const Y_FAC = req.params.Y_FAC;
   const N_FAC = req.params.N_FAC;
    dboperations.getInvoicesFACS(req,res,Y_FAC,N_FAC).then(result => {
       res.json(result);
    })
})

【问题讨论】:

  • trustedconnection: true 加上用户名没有意义,因为受信任的连接将使用 Kerberos SSO 进行连接,它使用已登录的用户。此外,您正在注入值,这使您对 SQL 注入持开放态度。您可能会发现多行字符串更易于阅读

标签: javascript sql node.js sql-server express


【解决方案1】:

您的代码中有三个问题。

首先,不需要在 DB 连接中捕获,而是在 getInvoiceDetails 中捕获,因为您最终可能会在连接函数中返回 err 而不是 DB instance

async function connectStock() {
    const pool = new sql.ConnectionPool(config);
    await pool.connect();
    console.log("Connected to database : ", config);
    return pool;
}

第二,不要因为SQL注入而直接在SQL中传递变量。您应该使用input() 如下所示来保护变量的类型。您可以针对您的案例检查特定字段的数据类型。

const getInvoiceDetails = async (request, response, Y_FAC, N_FAC) => {
    try {
        let DB = await connectStock();
        try {
            let q =
                "select m.CODE_ART,a.a_code,a.DESC_ART,m.NB_CAISS,sum((m.QCAISSE * m.NB_CAISS) + m.QPIECE + m.MORE_FREE + m.QTY_XTRA) as 'TotalPc' " +
                " from cli_fac f inner join cli_mvt m on f.Y_FAC = m.y_fac and f.n_fac = m.n_fac" +
                " inner join article a on a.code_art = m.CODE_ART where  m.TRANS_TYPE = 'FA'" +
                " and f.Y_FAC = @Y_FAC" +
                " and f.N_FAC = @N_FAC" +
                "' group by m.CODE_ART,m.NB_CAISS,a.a_code,a.DESC_ART";

            console.log("query get in details ", q);

            const invoicesDet = await DB.request()
                .input("Y_FAC", sql.NVarChar, Y_FAC)
                .input("N_FAC", sql.NVarChar, N_FAC)
                .query(q);

            return invoicesDet.recordsets;
        } catch (err1) {
            console.log("Unable to get Invoice: " + err1.message);
        } finally {
            DB.close();
        }
    } catch (err2) {
        console.log("Unable to Connect to database: ", err2.message);
    }
};

第三,finally块中的数据库实例实际上并没有引用try块的数据库实例,因为它们在不同的块中。因此,您可以按照我在上面第二期中建议的代码进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多