Javascript GraphQL查询后:属性';然后';不存在于类型';无效';
我使用的graphql突变与.then&.catch完美结合:Javascript GraphQL查询后:属性';然后';不存在于类型';无效';,javascript,reactjs,typescript,graphql,react-apollo,Javascript,Reactjs,Typescript,Graphql,React Apollo,我使用的graphql突变与.then&.catch完美结合: let submitForm = ( email: string, firstName: string ) => { setIsSubmitted(true); if (email && (firstName)) { const input: UpdateUserInput = {}; if (firstName) { input
let submitForm = (
email: string,
firstName: string
) => {
setIsSubmitted(true);
if (email && (firstName)) {
const input: UpdateUserInput = {};
if (firstName) {
input.firstName = firstName;
}
updateUser({
variables: {
email: email,
input: input,
},
})
.then(({ data }: ExecutionResult<UpdateUserResponse>) => {
if (data !== null && data !== undefined) {
setIsUpdated(true);
}
})
.catch((error: { message: string }) => {
console.log('Error msg:' + error.message);
});
}
};
但是,我一直得到一个错误,即类型“void”上不存在属性“then”
编辑:
没有.then、.catch,我的代码工作正常。完整形式是这样的:
function UserSearchPage() {
const [criteria, setCriteria] = useState('');
const [searchItem, setSearchItem] = useState('');
const [loadUsers, { loading, data }] = useLazyQuery(LoadUsersQuery);
function PrintUsers({ data }: any) {
return (
<div>
{data &&
data.users.nodes &&
data.users.nodes.map((c: any, i: any) => (
<li key={i}>
Id: {c.id}, First Name: {c.firstName}, Last Name: {c.lastName},
Email: {c.email}, phoneNumber: {c.phoneNumber}
</li>
))}
</div>
);
}
let ShowUsers = () => {
const where: WhereInput = {};
if (criteria === '1') {
loadUsers({
variables: {
where: where
},
});
}
if (criteria === '2') {
if (searchItem) {
where.firstName_contains = searchItem;
loadUsers({
variables: {
where: where
},
});
}
}
};
return (
.....);
}
我还可以如何访问数据属性/错误?
从console.log中,我知道返回的是:
Object
__typename: "User"
email: "first@first.com"
firstName: "First"
id: 148
lastName: "User"
phoneNumber: "+49123"
但是,如果我尝试访问,比如说
data.users.id
,为什么我会被未定义?如何修复此问题?这取决于loadUsers
中到底发生了什么,但很可能您忘记了返回语句
如果您更改
loadUsers
以返回它所加载的用户的承诺,那么您的代码应该可以很好地开始工作。这取决于loadUsers
中到底发生了什么,但很可能您忘记了返回语句
如果您更改loadUsers
以返回它所加载的用户的承诺,那么您的代码应该可以很好地开始工作。如果您查看useLazyQuery
,它不会像UseVariation
那样返回承诺,因此它们的行为不同
您必须使用调用useLazyQuery
时返回的第二个参数(加载、数据),而不是依赖于承诺。这就是为什么在您的编辑中,您的代码在没有的情况下工作。然后如果您查看useLazyQuery
,它不会返回承诺
像usemotation
,因此它们的行为不同
您必须使用调用useLazyQuery
时返回的第二个参数(加载、数据),而不是依赖于承诺。这就是为什么在您的编辑中,您的代码在没有的情况下工作。然后
如其他答案所述,这是已知的问题-
而不是
loadUsers({
variables: {
where: where
},
})
.then(({ data }: any) => {
if (data !== null && data !== undefined) {
}
})
您可以使用onCompleted
选项
const [loadUsers, { loading, data }] = useLazyQuery(LoadUsersQuery, {
onCompleted: ( data : any ) => {
if (data !== null && data !== undefined) {
// some action
}
}
});
如其他答案所述,这是一个已知的问题-
而不是
loadUsers({
variables: {
where: where
},
})
.then(({ data }: any) => {
if (data !== null && data !== undefined) {
}
})
您可以使用onCompleted
选项
const [loadUsers, { loading, data }] = useLazyQuery(LoadUsersQuery, {
onCompleted: ( data : any ) => {
if (data !== null && data !== undefined) {
// some action
}
}
});
where isloadUsers
?问题更新@Wyckwhere isloadUsers
?问题更新@WyckloadUsers是一个图形查询。我想我不需要回执,是吗?与第一个示例一样,updateUser()也是一个graphql变体,可以正常工作。你能看看我更新的qs,然后解释一下你的意思吗?这个答案绝对正确。op的例子中隐藏的是,loadUsers
来自一个外部方法,useLazyQuery
由Apollo提供。返回的方法没有返回承诺。那么,我如何访问错误消息呢?另外,例如,查询返回一个属性为id
的对象,那么我如何访问该属性呢?在发生突变的情况下,我只需要执行data.loadUsers.id
或其他操作,它会起作用,但在这种情况下不起作用。那么解决办法是什么呢@LMulveyLadusers是一个graphql查询。我想我不需要回执,是吗?与第一个示例一样,updateUser()也是一个graphql变体,可以正常工作。你能看看我更新的qs,然后解释一下你的意思吗?这个答案绝对正确。op的例子中隐藏的是,loadUsers
来自一个外部方法,useLazyQuery
由Apollo提供。返回的方法没有返回承诺。那么,我如何访问错误消息呢?另外,例如,查询返回一个属性为id
的对象,那么我如何访问该属性呢?在发生突变的情况下,我只需要执行data.loadUsers.id
或其他操作,它会起作用,但在这种情况下不起作用。那么解决办法是什么呢@LMulveyI尝试添加{loading,data,error}
,但是如果我添加了console.log('error:',error)代码>在loadUsers查询结束后,我总是未定义。即使有错误。正确的使用方法是什么?我找不到任何相关的示例。我尝试添加{loading,data,error}
,但是如果我添加了console.log('error:',error)代码>在loadUsers查询结束后,我总是未定义。即使有错误。正确的使用方法是什么?我找不到任何相关示例。由于我多次使用loadUsers查询(每次使用不同的参数),我不确定这是否可行。我尝试添加{loading,data,error}
,但如果我添加console.log('error:',error')代码>在loadUsers查询结束后,我总是未定义。即使有错误。正确的使用方法是什么?我找不到任何相关的例子。你可以从多个地方用不同的变量调用变异-数据处理通常是相同的<如果数据
正常,则可以不定义代码>加载
,但这并不能真正回答我的问题。那么,我还可以如何访问错误消息?另外,例如,查询返回一个属性为id
的对象,那么我如何访问该属性呢?在发生突变的情况下,我只需要执行data.loadUsers.id
或其他操作,它会起作用,但在这种情况下不起作用。那么解决方案是什么呢?错误
在组件fn body中可用(就像您之前尝试的那样)。。。身份证件检查响应/console.log吗data.id
?由于我多次使用loadUsers查询(每次都使用不同的参数),我不确定这是否可行。我尝试添加{loading,data,error}
,但如果我使用console.log('error:',error')代码>在loadUsers查询结束后,我总是未定义。即使有错误。正确的使用方法是什么?我找不到任何相关的例子。你可以从多个地方用不同的变量调用变异-数据处理通常是相同的<如果数据
正常,则可以不定义代码>加载
,但这并不能真正回答我的问题。我还能做什么