使用graphql来更新数据库中的用户名(在nextjs/react应用程序中),但不确定如何处理运行时错误(例如name已经存在)。抛出错误会导致get bad请求运行时错误,如果我们在解析器中return
这个错误,它会导致一个唯一的约束失败运行时错误。有没有人有任何见解,为什么应用程序显示坏的请求运行时错误时,已经有一个尝试和捕获,以及如何妥善处理它?
nextjs/反应代码
const UPDATE_NAME = gql`
mutation Mutation(
$id: ID!
$newName: String
) {
updateName(
id: $id
name: $newName
)
}
`
// useMutation from apollo client
const [updateName, { data, loading, error }] =
useMutation(UPDATE_NAME);
return (
<>
{error && <span>Fail</span>}
{data && <span>Success</span>}
</>
);
typeDef
updateName(
id: ID
newName: String
): String
解析器
try {
user = await prisma.user.update({
where: {
id: id,
},
data: {
name: newName,
},
});
} catch (e) {
if (e instanceof Prisma.PrismaClientKnownRequestError) {
if (e.code === "P2002") {
throw new UserInputError("Bad Request", { errors: e }); // leads to runtime error
// return e // will lead to Invalid `prisma.user.update()` invocation error
}
}
}
return user.name;
是否有人有任何见解,为什么应用程序显示坏的请求运行时错误时,已经有一个尝试和捕获,以及如何妥善处理它?
在此部分中,您捕获错误,但随后抛出新的错误。你抛出的新错误不会被任何东西捕获。
} catch (e) {
if (e instanceof Prisma.PrismaClientKnownRequestError) {
if (e.code === "P2002") {
throw new UserInputError("Bad Request", { errors: e }); // leads to runtime error
// return e // will lead to Invalid `prisma.user.update()` invocation error
}
}
}
如果这个错误是预期的,你可以返回一个非错误的值,并让用户知道。
resolver:
} catch (e) {
if (e instanceof Prisma.PrismaClientKnownRequestError) {
if (e.code === "P2002") {
return {
'id': 'duplicate'
}
}
}
}
----
nextjs/react code:
return (
<>
{updateName.id === 'duplicate' && <span>Name already exists</span>}
{error && <span>Fail</span>}
{data && <span>Success</span>}
</>
另一种方法是使用componentDidCatch
并以这种方式处理错误。