node - npm-mssql - es6 - כיצד לבצע שאילתא עם משתנים
-
אני משתמש בחבילת mssql
ע"מ להמנע מהזרקות sql
אני משתמש באפשרות המובנת של es6אני מעוניין לבצע שאילתא שסעיף ה
select
קבוע
והwhere
משתנה לפי req.queryהבעיה היא
- שכתוב שם
Column names cannot be passed/set in statements using variables. - שאני בכ"ז רוצה לכתוב את הselect רק פעם אחת
דוגמא:
router.get('/all_users', (req, res) => { let ids = req.query; if (ids) { const idList = ids.split(',').map(id => `'${id.trim()}'`).join(','); ids = ` and id_user in (${idList})`; } sql.connect(Config).then(pool => { return pool.request().query` select * from users where active = 1 ${ids}`; }).then(result => { res.send(result.recordset); }).catch(err => { console.error(err); res.status(500).send(err.message); }); });
- שכתוב שם
-
במקרה כזה אתה חייב להשתמש בפרמטרים במפורש (שזה הדרך הרגילה טרום הES6 Tag Function)
router.get('/all_users', (req, res) => { const sql = "select * from users where active = 1" sql.connect(Config).then(pool => { const request = pool.request(); if(req.query){ request.input('idList', sql.VarChar, req.query.split(',').map(id => Number(id)).join(',')); sql += "and id_user in (@idList)"; } return request.query(sql); }).then(result => { res.send(result.recordset); }).catch(err => { console.error(err); res.status(500).send(err.message); }); });
הTrim שעשית מיותר כי ברשימת in מותר שיהיו רווחים.
מאידך שמתי Number שמוודא שמדובר במספר, הוא על הדרך גם עושה Trim שהרי הוא מביא מספר גם למספר עם רווחים.