2016-03-04 12 views
12

Jak mogę napisać szablon dosłowny (multi-line) w ES6 ciąg, który będzie zawierał odwrócone, pojedyncze apostrofy (`) i Sama (tj zagnieżdżone backticks).Szablon literały z zagnieżdżonych backticks (`) w ES6

Np:

var query = ` 
    UPDATE packet 
    SET 
    `association` = "3485435", 
    `tagname` = "associated" 
` 

Powód muszę go:

To oczywiste w moim przykładzie kodu powyżej.

Próbuję budować zapytania node-mysql jako Strings i przechowywać je w zmiennej do przekazywania do MySQL. Składnia MySQL Query wymaga odwrócone, pojedyncze apostrofy dla UPDATE -Style zapytaniami.

  • Jedynym sposobem mogę mieć ich wygląd schludny i uporządkowany jest za pomocą literałów szablonów, w przeciwnym razie zapytań przy użyciu zwykłego ciągi jednowierszowym wyglądają trochę straszny Powodują one skończyć będąc bardzo, bardzo długo, jest kilka przypadków.

  • Również nie chcę kończyć linii przy użyciu \n, ponieważ jest uciążliwe.

+3

Mój instynkt reaguje z przerażeniem na ideę zwykłych ciągów szablonów używanych do konstruowania zapytań SQL, ale domyślam się, że nie masz żadnych zmiennych w twoim przykładzie, więc nie ma jeszcze ryzyka. Zachowaj ostrożność (tzn. Nie dodawaj) o dodawaniu tutaj interpolacji zmiennej, chyba że używasz funkcji znacznika szablonu specjalnie do konstruowania zapytań, które wykonują autoescaping kontekstowy. –

+0

@JeremyBanks Hm, czy jest to obawa SQL iniekcji? Jeśli tak jest, używam 'connection.escape()' dla każdego parametru, który przychodzi przez moje API, które zajmuje się tym. Używam sterownika [węzeł-mysql] (https: // github.com/felixge/node-mysql), który zawiera tę metodę. –

+0

Tak, to jest moja troska. Możliwe jest napisanie bezpiecznego kodu za pomocą czegoś w stylu 'connnection.escape()', ale to stwarza możliwość, że stracisz parametr (lub ucieczka zostanie usunięta przez zmasakrowaną prostą lub coś podobnego). Ogólny trend jest oddalony od wszystkiego, co * kiedykolwiek * wymaga ręcznego przechodzenia i konsekwentnego korzystania z interfejsów API dostarczonych przez DB w celu jawnego dostarczania wartości dla wyrażeń zapytań. Wygląda na to, że sort-of-node-mysql używa wspólnego podejścia pozwalając ci wstawić '?' Jako symbol zastępczy wartości w zapytaniu i przekazać wartości jako tablicę. Sugeruję, że pomimo problemów. –

Odpowiedz

8

Od ES6 In Depth: Template strings by Jason Orendorff:

Jeśli trzeba napisać znaku odwróconego apostrofu wewnątrz łańcucha szablonu, trzeba uciec go odwrotnym ukośnikiem: `\`` jest taka sama jak "`".

Zapytanie powinno być:

var query = `UPDATE packet 
    SET 
    \`association\` = "3485435", 
    \`tagname\` = "Simos"` 
3

Użyj \ ", wydaje się działać dla mnie w najnowszym Chrome.

+0

w węźle 4.8.3 i chrome \ 'works '\' 'nie działa w żadnej z nich, ta druga jest często wymieniona w innych odpowiedziach – wetlip

3

Jeśli chcesz użyć apostrof w ciąg złożony z apostrofami, uciec go odwrotnym ukośnikiem, tak:

'\'' 

Podobnie , jeśli chcesz użyć odsyłacza w formacie literału szablonu, musisz go przekonwertować odwrotnym ukośnikiem:

`\`` 
3

Zobacz 11.8.6 Template Literal Lexical Components

Szablon bez substytucji jest zdefiniowany jako

NoSubstitutionTemplate :: 
    `TemplateCharactersopt`

gdzie postać szablon jest

TemplateCharacter :: 
    $ [lookahead ≠ { ] 
    \EscapeSequence 
    LineContinuation 
    LineTerminatorSequence 
    SourceCharacter but not one of ` or \ or $ or LineTerminator

Dlatego ` nie może być znak szablon chyba uciec przez poprzedzającego go \.

1

Osobiście uważam ES6 literały szablonów być nieodpowiednia dla SQL (i obniżki) głównie dlatego, że nie można używać grawis znaków. Szkoda, że ​​nie byłoby dodać potrójnych cudzysłowów, aby rozwiązać ten prawidłowo.

W międzyczasie, prawdopodobnie używasz transpilatora do ES6, możesz rozważyć użycie triplet (zrzeczenie się: Jestem autorem).

0

ES6 posiada nowe funkcje

literałów Szablon

i

Tagged literały szablonu (Tagged szablony)

które sprawiają, że praca z tekstem łatwiejsze. Zawinąć tekst w `backticks`

Dzięki temu możemy:

zmienne 1.Interpolate

let foo = "abc"; 

console.log(`Welcome ${foo}`); // Welcome abc 

2.Interpolate Każdy rodzaj ekspresji

console.log(`2+3 = ${2+3}`) // 2+3 = 5 

3.Declare ciągi zarówno z cudzysłowem "jak i" bez konieczności usuwania czegokolwiek.

let foo = `foo is 'bar', "bar" is foo` 

console.log(foo); // "foo is 'bar', "bar" is foo" 

4.Cleaner składni dla wielu linii ciąg

let text = `foo is bar 

bar is foo` 

console.log(text); 

//"foo is bar 

//bar is foo" 

5.Tagged szablony, możemy przejść literały szablonów do funkcji, oto jak:

let person = 'Mike'; 
let age = 28; 

let output = myTag `that ${ person } is ${ age }`; 

function myTag(strings, personExp, ageExp) { 

//strings[0] gets value "that " 
//strings[1] gets value " is " 
//personExp gets value " Mike " 
//ageStr  gets value "28" 

return strings[0] + personExp + strings[1] + ageExp; 
} 

console.log(output); 

// that Mike is 28 

6.String.raw , możemy uzyskać surową formę, oto przykład:

let text = String.raw `The "\n" newline won't result in a new line.' 
console.log(text); 
// The "\n" newline won't result in a new line. 

Mam nadzieję, że to pomoże !!!!!!

1

Jak wspomniano w innych odpowiedzi, można uciec od znaku odwróconego apostrofu ` z odwrotnym ukośnikiem, jak \`.

var tripleBacktickExample = ` 
\`\`\`python 
# This JavaScript string contains some example Markdown that 
# uses triple-backticks to delimit a Python code block. 
\`\`\` 
` 

Jednak jeśli trzeba bardzo wiele odwrócone, pojedyncze apostrofy w rzędzie ````` wewnątrz szablonu dosłownym, to może być bardziej czytelny, aby umieścić je w normalnej ciąg znaków, który znajduje się wewnątrz zastępczego, jak ${'`````'} lub ${"`````"}.

var tripleBacktickExample = ` 
${'```'}python 
# This JavaScript string contains some example Markdown that 
# uses triple-backticks to delimit a Python code block. 
${'```'} 
`