Next.js 13路由处理器中Prisma $executeRaw触发1105错误
问题解决指南
第一个错误:Raw Query语法报错(P2010)
这问题根源是你直接用参数绑定表名了——Prisma的参数绑定只支持数值/字符串这类值,不支持表名、列名这种SQL标识符。直接插进去会导致语法错误,还存在SQL注入风险。
修复方式:
- 先校验表名合法性:先判断传入的
table是不是数据库里实际存在的表,比如只允许post、projects这类指定表,避免恶意参数传入 - 用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
相关产品推荐
相关产品推荐

