使用 JavaScript 模板文字连接字符串时出现问题

Problem concatenating strings using JavaScript template literals

我正在使用 prisma.io 库,但在使用模板文字来执行我想要的操作时遇到了问题。可能是我理解不够。

我有这个电话:

const result = await prisma.$queryRaw`SELECT * FROM User WHERE active = ${activeSetting}`

这完全符合我的要求。

但是,我想有选择地在末尾附加一个字符串,而不必重做完整的语句。

也就是说,我想要这样的东西:

let result;
if (orderBy === "ASC") {
  const result = await prisma.$queryRaw`SELECT * FROM User WHERE active =
      ${activeSetting} ORDER BY ASC`
} else if {
  const result = await prisma.$queryRaw`SELECT * FROM User WHERE active =
      ${activeSetting} ORDER BY DESC`
}

基本上,我不想必须完成以 const result = await 开头的语句。我意识到这是一个简短的例子,但我的问题是当我有相当长的 SQL 语句时,我发现自己做了很多剪切和粘贴巨大的 SQL 这很容易出错。

您可以像这样使用 ternary operator

const result = await prisma.$queryRaw`SELECT * FROM User WHERE active =
      ${activeSetting} ORDER BY ${orderBy === 'ASC' ? 'ASC' : 'DESC'}`

但最好不要写原始的 SQL 字符串,因为这样会使自己容易受到 SQL Injection

的攻击

我意识到我可以做一个更大的 sql 语句以及连接更大的代码块,这会使问题更清楚。感谢@CertainPerformance 和@Phil 的想法。

这就是我真正想要的,它可以解决我更大的问题,同时还能保证我的安全,我很确定。

    const orderByAsc = Prisma.sql`ORDER BY ASC`;
    const orderByDesc = Prisma.sql`ORDER BY DESC`;
    const result =
      await prisma.$queryRaw`SELECT * FROM User WHERE active = ${activeSetting} ${
        orderBy === 'ASC' ? orderByAsc : orderByDesc
      }`;

如果需要的话,它还让我在子句中加入表达式。