得到错误的请求nextjs运行时错误,尽管HTTP 200从graphql



使用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并以这种方式处理错误。

相关内容

  • 没有找到相关文章

最新更新