2016-03-04 30 views
12

Come posso scrivere un modello letterale (stringa multilinea) in ES6 che conterrà backtick (`) in sé e per sé, (i nerfittidi nidificati).Caratteri letterali con apici inversi (`) in ES6

es:

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

Ragione ne ho bisogno:

E 'ovvio nel mio esempio codice di cui sopra.

Sto cercando di creare query node-mysql come Strings e memorizzarle in una variabile per passarle a mySQL. La sintassi della query mySQL richiede i backtick per le query in stile UPDATE.

  • L'unico modo che posso avere loro un aspetto ordinato e pulito è quello di utilizzare letterali template, altrimenti le query utilizzando normali stringhe a linea singola guardare una causa terribile po 'finiscono per essere molto, molto lungo è alcuni casi.

  • Inoltre, non voglio terminare le righe utilizzando \n perché è ingombrante.

+3

Il mio istinto è quello di reagire con il terrore all'idea di stringhe di modello semplici utilizzati per la costruzione di query SQL, ma immagino che in realtà non hanno alcuna variabile nel tuo esempio, quindi non c'è ancora alcun rischio. Si prega di fare molta attenzione (ad esempio, non farlo) sull'aggiunta di interpolazione variabile qui, a meno che non si stia utilizzando una funzione di tag template specificatamente per la costruzione di query che sta eseguendo l'autoescaping contestuale. –

+0

@JeremyBanks Hm, si tratta di un problema di SQL-injection-esque? Se questo è il caso sto usando 'connection.escape()' per ogni parametro che passa attraverso la mia API che si occupa di questo. Sto usando [node-mysql driver] (https: // github.com/felixge/node-mysql) che contiene questo metodo. –

+0

Sì, questa è la mia preoccupazione. È possibile scrivere codice sicuro usando qualcosa come 'connnection.escape()', ma ciò crea la possibilità che ti manchi un parametro (o che l'escaping sia rimosso da un mera distrutto o qualcosa del genere). La tendenza generale è lontano da tutto ciò che * mai * richiede l'escaping manuale e in modo coerente utilizzando API fornite da DB per fornire esplicitamente valori per le espressioni di query. Sembra che l'ordinamento 'node-mysql' utilizzi l'approccio comune che consente di inserire'? 'Come segnaposto per i valori nella query e passare i valori come una matrice. Lo suggerisco, nonostante i problemi. –

risposta

8

Da ES6 In Depth: Template strings by Jason Orendorff:

Se è necessario scrivere un backtick all'interno di una stringa di modello, è necessario fuggire con un backslash: `\`` è lo stesso "`".

Vostri criteri dovrebbe essere:

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

Utilizzare \ `, sembra funzionare per me nell'ultimo Chrome.

+0

nel nodo 4.8.3 e chrome \ 'works '\'' non funziona in entrambi, quest'ultimo viene citato spesso in altre risposte – wetlip

3

Se si desidera utilizzare un apostrofo in una stringa fatta con gli apostrofi, a fuggire con un backslash, come quella:

'\'' 

Allo stesso modo , se vuoi usare un backtick in un template letterale, devi esacaprarlo con una barra rovesciata:

`\`` 
3

Vedi 11.8.6 Template Literal Lexical Components

Un modello senza sostituzioni è definito come

NoSubstitutionTemplate :: 
    `TemplateCharactersopt`

in cui un personaggio modello è

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

Pertanto, ` non può essere un carattere modello a meno che non fuggire da essa precedendolo con \.

1

Personalmente ritengo che i letterali dei template ES6 siano inadeguati per SQL (e markdown) principalmente perché non è possibile utilizzare caratteri backtick. Vorrei che aggiungessero stringhe con virgolette per correggerlo correttamente.

Nel frattempo, dal momento che probabilmente utilizzi un transpiler per ES6, potresti prendere in considerazione l'utilizzo di triplet (dichiarazione di non responsabilità: sono l'autore).

0

ES6 ha nuove caratteristiche

letterali dei modelli

e

letterali template targhetta (template) Tagged

che rendono il lavoro più facile con le stringhe. Avvolgere il testo in `backticks`

Con questo siamo in grado di:

variabili 1.Interpolate

let foo = "abc"; 

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

2.Interpolate qualsiasi tipo di espressione

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

3.Declare stringhe con entrambe le virgolette "e" senza dover effettuare lo escape di .

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

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

4.Cleaner sintassi per stringa multi linea

let text = `foo is bar 

bar is foo` 

console.log(text); 

//"foo is bar 

//bar is foo" 

5.Tagged modelli, possiamo passare letterali template a una funzione, ecco come:

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 , possiamo ottenere la forma grezza, ecco l'esempio:

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. 

Spero che questo aiuti !!!!!!

1

Come accennato in altre risposte, si può sfuggire al backtick ` con un backslash, come \`.

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

Tuttavia, se avete bisogno di molti backticks di fila ````` all'interno del template letterale, potrebbe essere più leggibile di metterli all'interno di una stringa normale che si trova all'interno di un segnaposto, come ${'`````'} o ${"`````"}.

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