2016-03-04 34 views
12

Làm thế nào tôi có thể viết một mẫu chữ (chuỗi nhiều dòng) trong ES6 có chứa các dấu gạch chéo (`) trong và tự nó, (nghĩa là dấu sau).Văn bản mẫu với backticks lồng nhau (`) trong ES6

ví dụ:

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

Lý do tôi cần nó:

Rõ ràng trong ví dụ mã của tôi ở trên.

Tôi đang cố gắng xây dựng các truy vấn node-mysql dưới dạng Strings và lưu trữ chúng trong một biến để chuyển chúng tới mySQL. Cú pháp truy vấn mySQL yêu cầu backticks cho các truy vấn kiểu UPDATE.

  • Cách duy nhất tôi có thể có cho chúng trông gọn gàng và ngăn nắp là bằng cách sử dụng mẫu chữ, nếu không truy vấn sử dụng chuỗi single-line thường xuyên tìm kiếm một nguyên nhân khủng khiếp chút họ sẽ chỉ được rất, rất dài là một số trường hợp.

  • Tôi cũng không muốn chấm dứt các dòng bằng cách sử dụng \n vì nó cồng kềnh.

+3

Bản năng của tôi là phản ứng với ý tưởng về các chuỗi mẫu đơn giản được sử dụng để tạo truy vấn SQL, nhưng tôi đoán bạn không thực sự có bất kỳ biến nào trong ví dụ của bạn. Hãy rất cẩn thận (tức là không) về việc thêm nội suy biến tại đây, trừ khi bạn đang sử dụng chức năng thẻ mẫu cụ thể để xây dựng các truy vấn đang thực hiện tự động định kiểu theo ngữ cảnh. –

+0

@JeremyBanks Hm, đây có phải là mối lo ngại về SQL-injection-esque không? Nếu đó là trường hợp tôi đang sử dụng 'connection.escape()' cho mỗi và mọi tham số đi qua API của tôi mà giao dịch với điều này. Tôi đang sử dụng [trình điều khiển nút mysql] (https: // github.com/felixge/node-mysql) chứa phương thức này. –

+0

Vâng, đó là mối quan tâm của tôi. Có thể viết mã an toàn bằng cách sử dụng một cái gì đó như 'connnection.escape()', nhưng điều đó tạo ra khả năng bạn sẽ bỏ lỡ một tham số (hoặc có lối thoát được loại bỏ bởi một cái máng xối, hay cái gì đó). Xu hướng chung là cách xa mọi thứ * bao giờ * yêu cầu thoát bằng tay và liên tục sử dụng API do DB cung cấp để cung cấp giá trị rõ ràng cho biểu thức truy vấn. Có vẻ như 'node-mysql' sắp xếp sử dụng phương pháp chung cho phép bạn đặt'? 'Làm trình giữ chỗ cho các giá trị trong truy vấn và chuyển các giá trị dưới dạng mảng. Tôi đề nghị rằng, bất chấp vấn đề. –

Trả lời

8

Từ ES6 In Depth: Template strings by Jason Orendorff:

Nếu bạn cần phải viết một backtick bên trong một mẫu chuỗi, bạn phải thoát khỏi nó với một dấu chéo ngược: `\`` cũng giống như "`".

truy vấn của bạn nên là:

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

Sử dụng \ "có vẻ như hoạt động với tôi trong Chrome mới nhất.

+0

trong nút 4.8.3 và chrome \ ´ hoạt động '\ ´´ không làm việc trong một trong hai, sau này được đề cập thường trong câu trả lời khác – wetlip

3

Nếu bạn muốn sử dụng một dấu nháy đơn trong một chuỗi thực hiện với dấu nháy, bạn thoát khỏi nó với một dấu gạch chéo, như vậy:

'\'' 

Tương tự , nếu bạn muốn sử dụng backtick trong một mẫu chữ, bạn phải esacape nó với một dấu gạch chéo ngược:

`\`` 
3

Xem 11.8.6 Template Literal Lexical Components

Mẫu mà không thay thế được định nghĩa là

NoSubstitutionTemplate :: 
    `TemplateCharactersopt`

nơi một nhân vật mẫu là

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

Do đó, ` không thể là một mẫu nhân vật, trừ khi bạn thoát khỏi nó bằng cách trước nó với \.

1

Cá nhân tôi xem xét các văn bản mẫu ES6 không đủ cho SQL (và đánh dấu) chủ yếu vì bạn không thể sử dụng các ký tự gạch chéo. Tôi muốn họ sẽ thêm các chuỗi ba trích dẫn để sửa lỗi này đúng cách.

Trong thời gian chờ đợi, vì có thể bạn đang sử dụng trình chuyển đổi cho ES6, bạn có thể cân nhắc sử dụng triplet (tuyên bố từ chối trách nhiệm: Tôi là tác giả).

0

ES6 có nhiều tính năng mới

Template literals

Tagged literals mẫu (templates Tagged)

mà làm cho làm việc với chuỗi dễ dàng hơn. Bạn quấn văn bản của bạn trong `backticks`

Với điều này chúng ta có thể:

biến 1.Interpolate

let foo = "abc"; 

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

2.Interpolate bất kỳ loại biểu

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

3.Declare dây với cả dấu ngoặc kép 'và' mà không cần phải thoát bất kỳ thứ gì.

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

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

4.Cleaner cú pháp cho chuỗi đa dòng

let text = `foo is bar 

bar is foo` 

console.log(text); 

//"foo is bar 

//bar is foo" 

5.Tagged mẫu, chúng ta có thể vượt qua mẫu literals đến một chức năng, đây là cách:

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 , chúng tôi có thể lấy mẫu thô, dưới đây là ví dụ:

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. 

Hy vọng điều này sẽ giúp !!!!!!

1

Như đã đề cập trong câu trả lời khác, bạn có thể thoát khỏi backtick ` với một dấu gạch chéo, như \`.

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

Tuy nhiên, nếu bạn cần rất nhiều backticks liên tiếp ````` bên trong mẫu theo nghĩa đen, nó có thể là dễ đọc hơn để đặt chúng trong một chuỗi bình thường có nghĩa là bên trong một trình giữ chỗ, như ${'`````'} hoặc ${"`````"}.

var tripleBacktickExample = ` 
${'```'}python 
# This JavaScript string contains some example Markdown that 
# uses triple-backticks to delimit a Python code block. 
${'```'} 
` 
Các vấn đề liên quan