【发布时间】:2016-06-18 15:43:19
【问题描述】:
如何在 ECMAScript 6 中编写一个包含反引号(`)的模板文字(即嵌套反引号)?
例如:
var query = `
UPDATE packet
SET
`association` = "3485435",
`tagname` = "associated"
`
我需要它的原因:
在我上面的代码示例中很明显。
我正在尝试将 node-mysql 查询构建为 Strings 并将它们存储在一个变量中,以便将它们传递给 MySQL。对于UPDATE 样式的查询,MySQL 查询语法需要反引号。
-
让它们看起来整洁的唯一方法是使用模板文字,否则使用常规单行字符串的查询看起来很糟糕,因为在某些情况下它们最终会很长。
我还想避免使用
\n终止行,因为它很麻烦。
【问题讨论】:
-
我的直觉是对使用纯模板字符串来构造 SQL 查询的想法感到恐惧,但我猜你的示例中实际上没有任何变量,所以还没有风险。请非常小心(即不要)在此处添加变量插值,除非您使用模板标记函数专门用于构造执行上下文自动转义的查询。
-
@JeremyBanks 嗯,这是 SQL 注入式的问题吗?如果是这种情况,我将使用
connection.escape()处理通过我的API 处理的每个参数。我正在使用包含此方法的node-mysql driver。 -
是的,这是我关心的问题。可以使用
connnection.escape()之类的东西编写安全代码,但这可能会导致您错过一个参数(或者通过一个错误的方式删除转义,等等)。总的趋势是远离任何曾经需要手动转义的东西,转而始终使用 DB 提供的 API 来显式地为查询表达式提供值。看起来node-mysqlsort-of 使用了常见的方法,即让您将?作为查询中值的占位符,并将值作为数组传递。我建议,尽管有问题。 -
是的。那将是非常合理的,并且可能很好读。我们行业的安全状态是可耻的,而且风险正在迅速升级,所以每当我听到可能表明存在安全问题的事情时,我都会变得非常迂腐和恼火,尽管有时这有点没有根据。 :P
-
不不,我会说谢谢你让我免于遗漏
connection.escape()参数的风险。