2016-03-04 16 views
12

में नेस्टेड बैकटिक्स (`) के साथ टेम्पलेट अक्षर, मैं ईएस 6 में एक टेम्पलेट शाब्दिक (बहु-लाइन स्ट्रिंग) कैसे लिख सकता हूं जिसमें बैकटिक्स (`) और अपने आप में (i.e नेस्टेड बैकटिक्स) शामिल हो सकते हैं।ईएस 6

उदा:

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

कारण मैं इसे की जरूरत है:

यह ऊपर मेरी कोड उदाहरण में स्पष्ट है।

मैं node-mysql क्वेरी Strings के रूप में बनाने की कोशिश कर रहा हूं और उन्हें mySQL पर पास करने के लिए एक चर में संग्रहीत कर रहा हूं। MySQL क्वेरी सिंटैक्स को UPDATE-स्टाइल प्रश्नों के लिए बैकटिक्स की आवश्यकता है।

  • एक ही रास्ता मैं उन्हें साफ सुथरा दिखेगा हो सकता है, टेम्पलेट शाब्दिक का उपयोग करना है नियमित एकल लाइन तार का उपयोग कर अन्यथा प्रश्नों थोड़ा भयंकर कारण वे अंत जा रहा है देखने के लिए बहुत, बहुत लंबे कुछ मामलों है।

  • मैं \n का उपयोग करके लाइनों को समाप्त करना नहीं चाहता क्योंकि यह बोझिल है।

+3

मेरा वृत्ति एसक्यूएल प्रश्नों के निर्माण के लिए उपयोग किए जाने वाले सादे टेम्पलेट तारों के विचार से आतंक के साथ प्रतिक्रिया करना है, लेकिन मुझे लगता है कि आपके पास वास्तव में आपके उदाहरण में कोई चर नहीं है, इसलिए अभी तक कोई जोखिम नहीं है। कृपया वैरिएबल इंटरपोलेशन जोड़ने के बारे में बहुत सावधान रहें (यानी नहीं), जब तक कि आप टेम्पलेट टैग फ़ंक्शन का उपयोग विशेष रूप से उन प्रश्नों के निर्माण के लिए नहीं कर रहे हैं जो प्रासंगिक ऑटोस्केपिंग कर रहे हैं। –

+0

@ जेरेमीबैंक्स एचएम, क्या यह एक एसक्यूएल-इंजेक्शन-एस्क्यू चिंता है? यदि ऐसा है तो मैं अपने एपीआई के माध्यम से आने वाले प्रत्येक पैरामीटर के लिए 'connection.escape()' का उपयोग कर रहा हूं जो इससे संबंधित है। मैं [नोड-माइस्क्ल ड्राइवर] का उपयोग कर रहा हूं (https: // github।com/felixge/node-mysql) जिसमें यह विधि शामिल है। –

+0

हाँ, यह मेरी चिंता है। 'Connnection.escape()' जैसे कुछ का उपयोग करके सुरक्षित कोड लिखना संभव है, लेकिन इससे संभावना है कि आप एक पैरामीटर को याद करेंगे (या बचने के लिए केवल एक उलझन में, या कुछ हटा दिया गया है)। सामान्य प्रवृत्ति किसी भी चीज़ से दूर है जिसे * कभी * मैन्युअल से बचने की आवश्यकता होती है, और स्पष्ट रूप से क्वेरी अभिव्यक्तियों के लिए मूल्य प्रदान करने के लिए डीबी-प्रदत्त एपीआई का उपयोग करने की आवश्यकता होती है। ऐसा लगता है कि 'नोड-माइस्क्ल' सॉर्ट-इन आपको '?' को क्वेरी में मानों के लिए प्लेसहोल्डर के रूप में रखने के सामान्य दृष्टिकोण का उपयोग करता है, और मान को सरणी के रूप में पास करता है। मेरा सुझाव है कि, मुद्दों के बावजूद। –

उत्तर

8

ES6 In Depth: Template strings by Jason Orendorff से:

आप किसी टेम्पलेट स्ट्रिंग के अंदर एक बैकटिक लिखने के लिए की जरूरत है, तो आप इसे एक बैकस्लैश साथ भागने चाहिए: `\``"`" के समान है।

आपकी क्वेरी होना चाहिए: इसी प्रकार

'\'' 

:

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

\ "ऐसा लगता है, यह मेरे लिए नवीनतम क्रोम में काम करता है।

+0

नोड 4.8.3 और क्रोम \ 'काम' \ 'में काम नहीं करता है, बाद में अन्य उत्तरों में अक्सर उल्लेख किया जाता है – wetlip

3

आप अक्षर लोप के साथ किए गए एक तार में एपोस्ट्रोफ़ी का उपयोग करना चाहते हैं, तो आप यह एक बैकस्लैश के साथ, भागने की तरह , यदि आप टेम्पलेट शाब्दिक में बैकटिक का उपयोग करना चाहते हैं, तो आपको बैकस्लैश के साथ इसे एस्केप करना होगा:

`\`` 
3

देखें 11.8.6 Template Literal Lexical Components

प्रतिस्थापन के बिना एक टेम्पलेट

NoSubstitutionTemplate :: 
    `TemplateCharactersopt`

जहां एक टेम्पलेट चरित्र

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

इसलिए है के रूप में परिभाषित किया गया है, ` एक टेम्पलेट चरित्र जब तक आप इसे से बचने के नहीं किया जा सकता \ के साथ इसे पहले।

1

व्यक्तिगत रूप से मैं ईएस 6 टेम्पलेट अक्षरों को मुख्य रूप से SQL (और मार्कडाउन) के लिए अपर्याप्त होने पर विचार करता हूं क्योंकि आप बैकटिक वर्णों का उपयोग नहीं कर सकते हैं। काश वे ठीक से ठीक करने के लिए ट्रिपल-उद्धृत तार जोड़ देंगे।

इस बीच में, के बाद से आप शायद ES6 के लिए एक transpiler वैसे भी प्रयोग कर रहे हैं, तो आप triplet विचार कर सकते हैं (अस्वीकरण: मैं लेखक हूँ)।

0

ES6 नई सुविधाओं

खाका शाब्दिक

और

टैग की गईं टेम्पलेट शाब्दिक (टैग की गईं टेम्पलेट्स)

जो तार के साथ काम को आसान बनाने के है। आप `backticks`

में अपने पाठ लपेट इस के साथ हम कर सकते हैं:

1.Interpolate चर

let foo = "abc"; 

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

2.Interpolate अभिव्यक्ति की

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

3.Declare तार किसी भी तरह के बिना दोनों 'और "उद्धरण चिह्नों के साथ कुछ भी बचें।

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

console.log(foo); // "foo is 'bar', "bar" is foo" 
बहु लाइन स्ट्रिंग के लिए

4.Cleaner वाक्य रचना

let text = `foo is bar 

bar is foo` 

console.log(text); 

//"foo is bar 

//bar is foo" 

5.Tagged टेम्पलेट्स, हम टेम्पलेट शाब्दिक एक समारोह के लिए, पारित कर सकते हैं यहाँ है कैसे:

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 , हम कच्चे रूप प्राप्त कर सकते हैं, यहां उदाहरण है:

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. 

उम्मीद है कि यह मदद करता है !!!!!!

1

अन्य उत्तर में उल्लेख किया है, आप \` की तरह एक बैकस्लैश के साथ बैकटिक ` बचने, कर सकते हैं।

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

हालांकि, अगर आप एक पंक्ति ````` टेम्पलेट शाब्दिक अंदर में बहुत सारे बैकटिक की जरूरत है, तो उन्हें कोई सामान्य स्ट्रिंग एक प्लेसहोल्डर के अंदर है कि, ${'`````'} या ${"`````"} की तरह भीतर डाल करने के लिए पठनीय हो सकता है।

var tripleBacktickExample = ` 
${'```'}python 
# This JavaScript string contains some example Markdown that 
# uses triple-backticks to delimit a Python code block. 
${'```'} 
` 
संबंधित मुद्दे