You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13路由处理器中Prisma $executeRaw触发1105错误

问题解决指南

第一个错误:Raw Query语法报错(P2010)

这问题根源是你直接用参数绑定表名了——Prisma的参数绑定只支持数值/字符串这类值,不支持表名、列名这种SQL标识符。直接插进去会导致语法错误,还存在SQL注入风险。

修复方式:

  1. 先校验表名合法性:先判断传入的table是不是数据库里实际存在的表,比如只允许post、projects这类指定表,避免恶意参数传入
  2. 用Prisma.sql安全拼接表名:通过Prisma.raw()处理表名,规避语法错误

修改后的代码参考:

import { Prisma } from '@prisma/client';

export async function DELETE(req: Request) {
  const body: DeletePostProps = await req.json();
  const { table, postId } = body;

  // 仅允许指定表名,替换为你自己的实际表名
  const allowedTables = ['post', 'projects'];
  if (!allowedTables.includes(table)) {
    return new Response('非法表名', { status: 400 });
  }

  const session = await getServerSession(authOptions);

  if (session?.user) {
    // 用Prisma.raw安全处理表名
    await db.$executeRaw(Prisma.sql`
      DELETE FROM ${Prisma.raw(table)} WHERE id = ${postId};
    `);
    return new Response(`已删除帖子 ${postId}`, { status: 200 });
  } else {
    return new Response('未授权', { status: 401 });
  }
}

第二个错误:数据库连接失败

提示无法连接aws.connect.psdb.cloud:3306,排查方向:

  • 检查环境变量:确认.env.local(开发环境)或生产环境的DATABASE_URL配置正确,没有多余空格、引号这类低级错误
  • 网络/防火墙设置:本地开发时,测试能否ping通目标地址,是否有代理、防火墙拦截3306端口;如果是PlanetScale数据库,需确认你的IP已加入数据库白名单
  • 数据库状态:登录PlanetScale控制台,检查数据库实例是否正常运行,无停机或维护情况
  • Prisma版本兼容性:你当前使用5.2.0版本,可尝试更新到最新版,排除版本兼容问题

额外提醒

  • 绝对不能信任前端传入的table参数,必须严格校验,否则极易引发SQL注入攻击
  • 测试时可先用Postman或curl单独调用API,确认参数逻辑正常后,再结合前端按钮测试

内容的提问来源于stack exchange,提问作者hey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:40:24