Typescript, MySQL:记录Prisma错误



我正在使用相同的prisma客户端变量在一个序列中执行几个插入和更新语句,所有语句都包装在一个try catch中。

在catch中,我想将错误记录到数据库中,但我得到了错误:

无效prisma.$executeRaw()调用:原始查询失败。代码:N/A。消息:N/A

下面是我的代码:
let prisma = await new PrismaClient({
datasources: {
db: {
url: dbUrl,
},
},
});    
try {
await prisma.$executeRaw`
INSERT INTO table1(col1, col2)
VALUES (val1, cal2);`;
await prisma.$executeRaw`
INSERT INTO table2(col1, col2)
VALUES (val1, cal2);`;
} catch (err: any) {
console.log('Error doing and sql insert: ' + err);    
// Update the log item in the db with the error.
try {
console.log('getting ready to log sql error')
// We can't use the prisma variable above becuase it probably died when we got the error
// so create a new prisma variable here.
// The exception is on the next line.
let prisma2 = await new PrismaClient({
datasources: {
db: {
url: dbUrl,
},
},
});
await prisma2.$executeRaw`
UPDATE FisImportLog
SET Success = 0, Message = 'Error at: ${msg}.  ' + ${err}
WHERE FisImportLogGUID = ${logId};`;      
} catch (err: any) {
console.log('FIS Import *Log* Error Message: ' + err);    
// This was really bad!!!
// Call notification service here
}
}

谁能告诉我为什么我得到这个错误,以及我如何使用棱镜记录一个棱镜错误到数据库?

谢谢。

我发现了这个问题,感谢@Shea Hunter Belsky的评论

我正在记录来自Typescript try/catch的错误消息,错误中有很多单引号,这完全破坏了用于插入错误消息的动态sql。我把它们换成了刻度,然后就都工作了。

但要做到这一点,我必须使用棱镜。$executeRawUnsafe而不是prisma2。$executeRaw使用如下字符串模板:

let errMessage = err.toString().replace(/'/g, "`")
let errorLogSQL = `
UPDATE FisImportLog
SET Success = 0, Message = 'Error at: ${msg}:  ${errMessage}'
WHERE FisImportLogGUID = '${logId}';`; 
await prisma.$executeRawUnsafe(errorLogSQL);

注意:我还必须在where子句中用单引号包装ID,因为在字符串模板中我不这样做。

相关内容

最新更新