我正在尝试创建一个突变,但我不断收到一个 POST 正文丢失。我可以在调用 urql 和 codegen 钩子之前记录数据,并且我可以在错误的变量中看到数据,但是 chrome 不断出现“POST body missing”错误,并且服务器的解析器永远不会被命中。
我在 React 客户端上使用 Urql 和 Codegen,并在 Express API 上使用 Apollo-server。
这是我的代码:
突变定义(用于 codegen)
mutation UserLogin($email: String!, $password: String!) {
login(email: $email, password: $password) {
errors {
email {
error
isValid
}
password {
error
isValid
}
}
token
}
}
代码生成输出:
export const UserLoginDocument = gql`
mutation UserLogin($email: String!, $password: String!) {
login(email: $email, password: $password) {
errors {
email {
isValid
error
}
password {
isValid
error
}
}
token
}
}
`;
export function useUserLoginMutation() {
return Urql.useMutation<UserLoginMutation, UserLoginMutationVariables>(UserLoginDocument);
};
使用这个钩子失败,所以我尝试直接使用 urql: useMutation Hook (same error)
const [, executeMutation] = useMutation(`
mutation($email: String!, $password: String!) {
login(email: $email, password: $password) {
errors {
email {
error
isValid
}
password {
error
isValid
}
}
token
}
}
`);
我已经确认我可以使用原始提取执行查询:
async function fetchGraphQL(text: any, variables: any, token: string = '') {
const response = await fetch('http://localhost:4000/graphql', {
method: 'POST',
headers: {
Authorization: `bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: text,
variables,
}),
});
return await response.json();
}
但是,尝试通过 codegen 或仅使用 urql 的 useMutation 钩子生成钩子会导致:
{
...
"source": {
"body": "mutation ($email: String! $password: String!) { login(email: $email password: $password) { errors { email { error isValid } password { error isValid } } token } }",
...
},
"variables": {
"email": "...",
"password": "..."
},
"kind": "mutation",
"context": {
"url": "http://localhost:4000/graphql",
"preferGetMethod": false,
"suspense": false,
"requestPolicy": "cache-first",
"meta": {
"cacheOutcome": "miss"
}
}
},
"error": {
"name": "CombinedError",
"message": "[Network] Bad Request",
"graphQLErrors": [],
"networkError": {},
"response": {}
}
}
我有另一个非常简单的突变可以正常工作:
mutation SetActiveChild($childId: String!) {
setActiveChild(childId: $childId)
}
这是我的 typeDefs 和解析器:
类型定义
export const typeDefs = gql`
...
type Mutation {
"user login"
login(email: String!, password: String!): LoginResponse
}
...
`
解析器
export const resolvers = {
Query: {
...
},
Mutation: {
login: ({}, user: UserRegister) => {
return AuthGraph.login(user);
},
...
},
};
我对 GraphQL 很陌生,非常感谢提前帮助我了解我做错了什么。