gpt4 book ai didi

node.js - 使用 SQL Server 构建安全的动态查询

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:13 25 4
gpt4 key购买 nike

我刚开始使用nodejs mssql/tedious 库。我有一个使用列默认值的表,我不能期望日志始终包含所有这些值。我想知道是否有一种更简单的方法可以根据传递给日志函数的值动态安全地构建查询。

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()
}
}

您可以看到,在这里我被迫根据存在的值多次重写查询。有没有更优雅的方法来处理这个问题,而无需将值连接到字符串中?

最佳答案

除了向后兼容性之外,我真的不喜欢在 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 + ")")

关于node.js - 使用 SQL Server 构建安全的动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56014478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com