我在節點上構建了一個廚房水槽查詢,其中傳遞了大約 20 個表的幾個引數。它們都形成一個單一的 SQL 查詢:
if (data.basics.memberId) { sqlString = ` memberid=@memberId and` };
等等...
我傳遞了幾個引數(大約40個),但是我在向資料庫發送查詢時無法傳遞引數:
const pool = await utils.poolPromise
const recordset = await pool.request()
//basics
if (data.basics.memberId) {
.input('memberId', utils.sql.Int, data.basics.memberId)
};
.query(sqlString)
if (recordset.rowsAffected[0] > 0) {
...
...
...
}
我收到錯誤:
預期的宣告或宣告。
在
.input('memberId', utils.sql.Int, data.basics.memberId)
和
.query(sqlString)
我讀過引數不是構建動態查詢的正確方法,所以我想到了使用 ES6,因為
if (data.basics.memberId) { sqlString = ` memberid=${data.basics.memberId} and` };
但我讀過 ES6 不會阻止 SQL Server 上的 SQL 注入。
問題是我如何處理這種 SQL 字串可變并根據用戶選擇而變化的場景?
謝謝。
uj5u.com熱心網友回復:
如果沒有查詢構建器庫(例如 Knex),您需要
- 形成 SQL 查詢(作為字串)
- 把引數放到位
例如這樣的事情:
const whereClauses = [];
const inputs = {}; // map input name -> [type, value]
// (1) Process data into WHERE clauses and inputs
if (data.basics.memberId) {
whereClauses.push(`memberid=@memberId`);
inputs.memberId = [utils.sql.Int, data.basics.memberId];
}
if (data.basics.somethingElse) {
whereClauses.push(`somethingElse=@somethingElse`);
inputs.somethingElse = [utils.sql.Int, data.basics.somethingElse];
}
// (etc..., you could use a loop or something for the above)
// (2) Form the final SQL query
const sqlStringBits = ["SELECT * FROM ... WHERE "];
for (let whereClause of whereClauses) {
sqlStringBits.push(whereClause);
sqlStringBits.push("AND");
}
if (whereClauses.length) {
sqlStringBits.pop(); // Remove final AND if we had added one
}
const sqlString = sqlStringBits.join(" ");
// (3) Form the `request` and put the inputs into place
const pool = await utils.poolPromise;
let request = pool.request();
for (let inputName in inputs) {
request = request.input(inputName, ...inputs[inputName]);
}
// (4) Use the request (endowed with inputs) with the query
const recordSet = await request.query(sqlString);
// (5) Do something with the record set!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/398822.html
標籤:节点.js
下一篇:Nodejs應用突然開始表現不同
