Строковая интерполяция строки, хранящейся в переменной

#javascript #string #interpolation

Вопрос:

Я пытаюсь подготовить некоторый SQL-запрос для Amazon Athena с динамическими условиями » ГДЕ » в JavaScript. Запрос был сохранен для одной переменной в другом файле. Как добавить в него пользовательское условие WHERE?

Псевдокод, которого я пытаюсь достичь,

file1.js

 module.exports.queryFromFile1 = 'SELECT * Name FROM Contact WHERE Name = ?';
 

file2.js

 const {queryFromFile1} = require('./file1.js');

const newQuery = queryFromFile1,['Jane']; 
console.log(newQuery); // 'SELECT * Name FROM Contact WHERE Name = 'Jane'
 

Может ли кто-нибудь предложить мне правильный метод для этого? мое текущее решение опубликовано ниже.

file1.js

 module.exports.queryFromFile1 = 'SELECT * Name FROM Contact WHERE Name = {stringToReplace}';
 

file2.js

 const {queryFromFile1} = require('./file1.js');

const newQuery = queryFromFile1.replace("{stringToReplace}", "'Jane"); 
console.log(newQuery); // 'SELECT * Name FROM Contact WHERE Name = 'Jane'
 

Комментарии:

1. Пожалуйста, просто используйте подготовленные заявления. Нет необходимости открывать себя для SQL-инъекции , делая это вручную

2. @VLAZ Спасибо за комментарий. не могли бы вы подробнее рассказать о подготовленных заявлениях. запрос, который я готовлю, предназначен не для MYSQL/MSSQL, а для amazon Athena.

3. db.execute(queryFromFile1, ['Jane'])

4. привет, @LawrenceCherone, я пытаюсь выполнить этот запрос к Amazon Athena , поэтому упомянутый метод для меня не работает.

5. Я думаю, ты имел в виду SELECT * FROM Contact ?

Ответ №1:

Я использую небольшую вспомогательную функцию, которая позволяет вам использовать прямую интерполяцию строк es6 окольным путем:

 const template= (template, ctx) => {
   const script = new vm.Script('`'   template   '`')
   return script.runInNewContext(ctx)
}

const results = template('hello ${foo}', {foo:'jane'})
 

Но, если вам просто нужно выполнить простую интерполяцию, почему бы просто не экспортировать sql как функцию?

 const queryFromFile1 = str => (`SELECT * Name FROM Contact WHERE Name = ${str}`)

const query = queryFromFile1('Jane')
 

Ответ №2:

Как упоминалось в комментариях, вы не должны обрабатывать операторы SQL с необработанными строками.

Однако для не критичных для безопасности частей вашего кода (например, для ввода строки формата даты из реквизитов компонентов) я предпочитаю делать это именно так:

 const stringProducer = (insert) => `This was inserted: ${insert}`;
 

Затем используйте вот так:

 const string = stringProducer("foo");