使用SQL Server构造安全的动态查询

时间:2019-05-07 01:53:17

标签: node.js sql-server tedious

我是第一次使用nodejs mssql /乏味库。我有一个表,该表使用列的默认值,并且我不能指望日志总是显示所有这些值。我想知道是否有一种更简单的方法,可以根据将值传递给我的日志函数来安全地动态构建查询。

const sql = require('mssql')
const config = require('config')

const dconfig = config.database

const addLog = async (options) => {
  const { text, sentSuccess, isError } = options
  try {
    let pool = await sql.connect(dconfig)
    let request = await pool.request()
    request.input('message', sql.Text, text.trim())
    if (sentSuccess) {
      request.input('sent', sql.Bit, !!parseInt(sentSuccess))
      await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')
    } else {
      await request.query('insert into dbo.MApp_Logs (message) values (@message)')
    }
  } catch (err) {
    throw err
  } finally {
    sql.close()
  }
}

您可以看到,在这里我不得不根据存在的值多次重写查询。是否有更优雅的方式来处理此问题而不将值连接到字符串中?

1 个答案:

答案 0 :(得分:1)

除了向后兼容之外,我真的不喜欢在SQL中使用或依赖DEFAULT约束。但这是个人品味和偏好的问题。我希望在代码中处理默认值以进行新工作,并始终发送相同的SQL语句:

 request.input('message', sql.Text, text.trim())
 if (sentSuccess)
     request.input('sent', sql.Bit, !!parseInt(sentSuccess))
 else
     request.input('sent', sql.Bit, theDefaultValue)
 await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')

但是,如果您确实要使用SQL的默认定义,则可以始终使用sql语句并继续进行参数设置:

 request.input('message', sql.Text, text.trim())
 let sqlFields = "insert into dbo.MApp_Logs (message"
 let sqlValues = ") values (@message"

 if (sentSuccess) {
     request.input('sent', sql.Bit, !!parseInt(sentSuccess))
     sqlFields += ", sent_success"
     sqlValues += ", @sent"
 }

 await request.query(sqlFields + sqlValues + ")")