Javascript ES6中带嵌套回号(`)的模板文本

Javascript ES6中带嵌套回号(`)的模板文本,javascript,ecmascript-6,Javascript,Ecmascript 6,如何在ECMAScript 6中编写一个本身包含反勾号(`)的模板文字(即嵌套反勾号) 例如: var query = ` UPDATE packet SET `association` = "3485435", `tagname` = "associated" ` 我需要它的原因是: 这在我上面的代码示例中非常明显 我试图将查询构建为字符串,并将它们存储在一个变量中,以便将它们传递给MySQL。MySQL查询语法要求UPDATE样式的查询使用反勾号 我能让它们看起来整洁

如何在ECMAScript 6中编写一个本身包含反勾号(`)的模板文字(即嵌套反勾号)

例如:

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

我需要它的原因是:

这在我上面的代码示例中非常明显

我试图将查询构建为
字符串
,并将它们存储在一个变量中,以便将它们传递给MySQL。MySQL查询语法要求
UPDATE
样式的查询使用反勾号

  • 我能让它们看起来整洁的唯一方法是使用模板文本,否则使用常规单行字符串的查询看起来很糟糕,因为在某些情况下它们会很长

  • 我还希望避免使用
    \n
    终止线路,因为这很麻烦


    • 使用\`,在最新的Chrome中,它似乎对我有效。

      来自:

      如果需要在模板字符串中写入反勾号,则必须使用反斜杠对其进行转义:
      `
      `
      相同

      您的查询应该是:

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

      如果要在由撇号组成的字符串中使用撇号,请使用反斜杠将其转义,如下所示:

      '\''
      
      类似地,如果要在模板文字中使用反勾号,则必须使用反斜杠对其进行转义:

      `\``
      

      没有替换的模板定义为

      NoSubstitutionTemplate ::
          ` TemplateCharactersopt `
      NoSubstitutionTemplate::
      `TemplateCharactersopt`
      其中模板字符是

      TemplateCharacter ::
          $ [lookahead ≠ { ]
          \ EscapeSequence
          LineContinuation
          LineTerminatorSequence
          SourceCharacter but not one of ` or \ or $ or LineTerminator
      TemplateCharacter::
      $[前瞻≠ { ]
      \逃逸序列
      行延拓
      线路终止顺序
      SourceCharacter,但不是`或\或$或LineTerminator中的一个

      因此,<代码> <代码>不能是模板字符,除非您通过前面的代码“<代码> \/COD>”来逃避它。

      < P>个人认为,ES6模板文字对于SQL来说是不够的(和)主要是因为您不能使用Butkk字符。

      同时,由于您可能正在使用ES6的转发器,所以您可以考虑使用(免责声明:我是作者)。

      < P> ES6具有新的特性:

      • 模板文本
      • 标记的模板文字(标记的模板)
      这使得处理字符串更容易。你可以用“倒勾”来包装文本

      有了这一点,我们可以:

    • 内插变量

      let foo = "abc";
      
      console.log(`Welcome ${foo}`); // Welcome abc
      
    • 插入任何类型的表达式

      console.log(`2+3 = ${2+3}`) // 2+3 = 5
      
    • 声明同时带有“和”引号的字符串,而不必 逃避任何事情

      let foo = `foo is 'bar', "bar" is foo`
      
      console.log(foo); // "foo is 'bar', "bar" is foo"
      
    • 多行字符串的更简洁语法

      let text = `foo is bar
      
      bar is foo`
      
      console.log(text);
      
      //"foo is bar
      
      //bar is foo"
      
    • 标记模板,我们可以将模板文本传递给函数,如下所示:

      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
      
    • 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.
      
    • 如其他答案中所述,您可以使用反斜杠来避开反勾选
      `
      ,如
      \`

      var triplebackticketexample=`
      \`\`\`蟒蛇
      #此JavaScript字符串包含一些示例标记
      #使用三个反标记来分隔Python代码块。
      \`\`\`
      `
      
      但是,如果在模板文本中的一行中需要很多反勾号,那么将它们放在占位符中的普通字符串中可能更具可读性,如
      ${```}
      ${`}

      var triplebackticketexample=`
      ${`python}
      #此JavaScript字符串包含一些示例标记
      #使用三个反标记来分隔Python代码块。
      ${'```'}
      `
      
      要转义所有特殊字符,而不仅仅是反勾号,请执行以下操作:

      let str = '`Hello`\\n${world}';
      let escacped = str.replace(/\\|`|\$/g, '\\$&');
      console.log(eval('`' + escaped + '`') === str); // test
      
      我需要它来生成代码。
      str
      是一个JavaScript文件的内容,目标是将该内容放入一个字符串文本变量中,再放入另一个生成的JavaScript文件中


      遗憾的是,似乎有(2019年)没有用于此转义的本机JavaScript函数。需要替换的字符有:
      `
      \
      $
      \

      我本能地对使用纯模板字符串构造SQL查询的想法做出恐惧反应,但我猜您的示例中实际上没有任何变量,因此目前还没有风险。在此处添加变量插值时请非常小心(即不要),除非您使用的模板标记函数专门用于构造执行上下文自动转义的查询。@JeremyBanks Hm,这是SQL注入式的问题吗?如果是这种情况,我使用的是
      connection.escape()
      对于通过我的API处理此问题的每个参数。我使用的是包含此方法的。是的,这是我关心的问题。可以使用类似于
      connection.escape()的内容编写安全代码,但这会造成您丢失参数的可能性(或者用一个破破烂烂的东西或其他东西把逃逸的东西移走)。总的趋势是不再使用任何需要手动转义的方法,而是一致地使用DB提供的API为查询表达式显式提供值。看起来,
      节点mysql
      某种程度上使用了一种常见的方法,即允许您将
      作为查询中值的占位符,并传递值作为一个数组。我建议,尽管存在问题。是的。这将是非常合理的,而且可能可读性很好。我们行业的安全状况很糟糕,风险正在迅速上升,因此每当我听到可能表明安全问题的事情时,我都变得非常迂腐和恼火,尽管有时有点不知道rranted.:PNo不,我会说谢谢,因为你让我免于错过
      connection.escape()的风险
      node 4.8.3中的一个参数和chrome\`works```中的一个参数都不起作用,后者在其他版本中经常提到answers@NikKyriakides其他答案中只提到了我答案的前半部分。我的答案的后半部分展示了一种新的技巧。我包括了这两种技巧的示例,以便