Literales de plantilla con acentos graves anidados (`) en ES6

5 minutos de lectura

Literales de plantilla con acentos graves anidados en ES6
nicolaswmin

¿Cómo puedo escribir un literal de plantilla en ECMAScript 6 que contenga acentos graves (`) en sí mismos (es decir, acentos graves anidados)?

Por ejemplo:

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

La razón por la que lo necesito:

Es bastante obvio en mi ejemplo de código anterior.

estoy tratando de construir nodo-mysql consultas como Strings y almacenarlos en una variable para pasarlos a MySQL. La sintaxis de consulta de MySQL requiere marcas de retroceso para UPDATEconsultas de estilo.

  • La única forma en que puedo hacer que se vean limpios y ordenados es usando literales de plantilla; de lo contrario, las consultas que usan cadenas regulares de una sola línea se ven horribles porque terminan siendo muy largas en algunos casos.

  • También quiero evitar terminar líneas usando n ya que es engorroso.

  • Mi instinto es reaccionar con terror ante la idea de que se utilicen cadenas de plantilla simples para construir consultas SQL, pero supongo que en realidad no tiene ninguna variable en su ejemplo, por lo que aún no hay riesgo. Tenga mucho cuidado (es decir, no lo haga) al agregar la interpolación de variables aquí, a menos que esté utilizando una función de etiqueta de plantilla específicamente para construir consultas que realizan escape automático contextual.

    – Jeremy

    04 mar. 16 a las 19:00


  • @JeremyBanks Hm, ¿es esta una preocupación de SQL-injection-esque? Si ese es el caso, estoy usando connection.escape() para todos y cada uno de los parámetros que llegan a través de mi API que se ocupa de esto. Estoy usando controlador de nodo-mysql que contiene este método.

    – nicholaswmin

    04 mar. 16 a las 19:02


  • Sí, esa es mi preocupación. Es posible escribir código seguro usando algo como connnection.escape(), pero eso crea la posibilidad de que te pierdas un parámetro (o que un mero destrozado elimine el escape, o algo así). La tendencia general es alejarse de cualquier cosa que alguna vez requiere el escape manual y el uso constante de las API proporcionadas por la base de datos para proporcionar valores de forma explícita para las expresiones de consulta. Parece que node-mysql más o menos usa el enfoque común de dejarte poner ? como marcador de posición para los valores de la consulta y pase los valores como una matriz. Sugiero que, a pesar de los problemas.

    – Jeremy

    04 mar. 16 a las 19:11

  • Sip. Eso sería muy razonable, y probablemente muy legible. El estado de la seguridad en nuestra industria es vergonzoso y lo que está en juego aumenta rápidamente, por lo que me vuelvo bastante pedante e irritante cada vez que escucho algo que podría indicar un problema de seguridad, aunque a veces es un poco injustificado. :PAGS

    – Jeremy

    04 mar. 16 a las 19:21


  • No no, te daré las gracias ya que me has salvado del riesgo de omitir connection.escape() un parámetro

    – nicholaswmin

    04 mar. 16 a las 19:23

1644232747 868 Literales de plantilla con acentos graves anidados en ES6
tt9

Desde ES6 en profundidad: Cadenas de plantilla por Jason Orendorff:

Si necesita escribir un acento grave dentro de una cadena de plantilla, debe escapar con una barra invertida: ``` es lo mismo que "`".

Tu consulta debe ser:

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

Ver 11.8.6 Plantilla de componentes léxicos literales

Una plantilla sin sustituciones se define como

NoSubstitutionTemplate ::
    ` TemplateCharactersopt `

donde está un carácter de plantilla

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

Por lo tanto, ` no puede ser un carácter de plantilla a menos que lo escape precediéndolo con .

Como se menciona en otras respuestas, puedes escapar del acento grave ` con una barra invertida, como `.

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

Sin embargo, si necesita muchos acentos graves seguidos ````` dentro del literal de la plantilla, podría ser más legible colocarlos dentro de una cadena normal que está dentro de un marcador de posición, como ${'`````'} o ${"`````"}.

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

  • @NikKyriakides Solo la primera mitad de mi respuesta se mencionó en otras respuestas. La segunda mitad de mi respuesta demuestra una nueva técnica. Incluí ejemplos de ambas técnicas para que uno pueda compararlas directamente.

    – Rory O’Kane

    20 feb. 19 a las 20:50

Literales de plantilla con acentos graves anidados en ES6
Michał Perłakowski

Si quiere usar un apóstrofo en una cadena hecha con apóstrofes, escápelo con una barra invertida, como esta:

'''

Del mismo modo, si desea utilizar un acento grave en un literal de plantilla, debe escapar con una barra invertida:

```

Use `, parece funcionar para mí en la última versión de Chrome.

  • en el nodo 4.8.3 y chrome ´ funciona `´´ tampoco funciona, este último se menciona a menudo en otras respuestas

    – labio húmedo

    26 jun.


1644232748 563 Literales de plantilla con acentos graves anidados en ES6
Pedro Mortensen

Personalmente, considero que los literales de plantilla ES6 son inadecuados para SQL (y Reducción) principalmente porque no puede usar caracteres de acento grave. Desearía que agregaran cadenas entre comillas triples para solucionar esto correctamente.

Mientras tanto, dado que probablemente esté usando un transpilador para ES6 de todos modos, podría considerar usar trillizo (descargo de responsabilidad: yo soy el autor).

  • en el nodo 4.8.3 y chrome ´ funciona `´´ tampoco funciona, este último se menciona a menudo en otras respuestas

    – labio húmedo

    26 jun.


Para escapar de todos los caracteres especiales, no solo de los acentos graves:

let str="`Hello`\n${world}";
let escacped = str.replace(/\|`|$/g, '\$&');
console.log(eval('`' + escaped + '`') === str); // test

Necesitaba esto para algunas cosas de generación de código. El str era el contenido de un archivo JavaScript y el objetivo era poner este contenido en una variable literal de cadena en otro archivo JavaScript generado.

Lamentablemente, parece que (2019) no hay una función nativa de JavaScript para este escape. Los caracteres que necesitan ser reemplazados son: `, , $ y .

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad