如何将参数传递给节点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@inputField2mySecondInput 也会发生同样的事情。

这将有助于它从 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查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给SQL(Excel)中的查询

将函数参数传递给 sql 查询

Delphi:如何将列表作为参数传递给SQL查询?

如何将 vue.js 值作为参数传递给刀片中的路由

如何将参数传递给 nodemon(或 node-supervisor)中的可执行文件?

将参数传递给子节点解析器函数