如何将参数传递给节点js中的sql查询
Posted
技术标签:
【中文标题】如何将参数传递给节点js中的sql查询【英文标题】:How to pass parameter to mssql query in node js 【发布时间】:2019-11-14 07:41:26 【问题描述】:我正在将应用程序的数据库从 mysql 更改为 MSSQL。我为 MySQL 数据库发送如下参数。
var sql = require('./db.js');
sql.query("select * from table where field1 = ? or field2 = ? ", [field1val, field2val], function (error, results)
if(error)
//handle error
else
//handle the results
如何在 MSSQL 中做到这一点,或者甚至有可能做到这一点? (我正在使用mssql
模块)。
存储过程是实现的唯一方法吗?如果是这样,如何在 Nodejs mssql 模块中做到这一点?
如果我们无法发送参数(在 mysql 中自动转义字符串),在 SQL Server 中运行查询的最佳做法是什么?
【问题讨论】:
请分享您的 db.js 脚本,以便我们知道您的 sql.query 函数中发生了什么 sql.query("select * from table where field1 = "+field1val+" or field2 = "+field2val, function (error, results) ***.com/questions/31822891/… 【参考方案1】:我做这样的参数化 SQL 查询:
var sql = require('mssql');
var myFirstInput = "foo bar";
var mySecondInput = "hello world";
sql.input('inputField1', sql.VarChar, myFirstInput);
sql.input('inputField2', sql.VarChar, mySecondInput);
sql.query("SELECT * FROM table WHERE field1 = @inputField1 OR field2 = @inputField2")
.then(function(results)
//do whatever you want with the results
console.log(results)
)
.catch(function(error)
//do whatever when you get an error
console.log(error)
)
这里发生的是sql.input('inputField1', sql.VarChar, myFirstInput)
将用名为myFirstInput
的变量替换@inputField1
。 @inputField2
和 mySecondInput
也会发生同样的事情。
这将有助于它从 SQL 注入
【讨论】:
每次查询后输入是否“重置”? @workwise 只要在每次查询时为“myFirstInput”和“mySecondInput”分配不同的变量,那么每次调用函数时输入的值都会不同。【参考方案2】:你可以这样尝试
var id = 1234
var query = (SQL
`SELECT fname, lname, email
FROM users
WHERE id = $id`
)
var sql = require('./db.js');
sql.query("select * from table where field1 = $field1val or field2 = $field2val ", [field1val, field2val], function (error, results)
if(error)
//handle error
else
//handle the results
【讨论】:
【参考方案3】:var sql = require('./db.js');
sql.query(`select * from table where field1 = $field1val or field2 = $field2val`, function (error, results)
if(error)
//handle error
else
//handle the results
我认为,它适合你:)
【讨论】:
小心sql注入。 mssql 确实提供了一种标记模板方法,他们声称可以防止 sql 注入:github.com/tediousjs/node-mssql#es6-tagged-template-literals(虽然要清楚,这个例子没有使用它) 如果我们可以信任node-mssql documentation,+1 到 ES6 标记模板文字以上是关于如何将参数传递给节点js中的sql查询的主要内容,如果未能解决你的问题,请参考以下文章