Dataprovider resulting in String instead of Int
I am using the Hasura dataprovider, and i've passed the following
const gqlDataProvider = dataProvider(client, {idType: "Int"});
Expecting it to give an Int, but it keeps giving me a string, when my schema needs an Int.
Coming from this query
export const COMPANY_TITLE_QUERY = gql
query CompanyTitle($where: ID!) {
companies(where: $id) {
id
name
createdAt
avatarUrl
salesOwner {
id
name
avatarUrl
}
}
}
;
Which is from the onFinish function.
Why isnt it passing an int? And the where variable?
This is the payload
{,…}
operationName
:
"CompanyTitle"
query
:
"query CompanyTitle($where: ID!) {\n companies(where: $id) {\n id\n name\n createdAt\n avatarUrl\n salesOwner {\n id\n name\n avatarUrl\n }\n }\n}\n"
variables
:
{id: "21"}
Response
{
"errors": [
{
"message": "expecting a value for non-nullable variable: "where"",
"extensions": {
"path": "$",
"code": "validation-failed"
}
}
]
}20 Replies
Hi @Konungariket Sverige. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave:
----------------------
Based on the information provided from the extracts, it seems like you're encountering an issue with the Hasura data provider in refine, specifically with the handling of ID types. You've configured the data provider to use
Int
as the ID type, but you're still getting a string, and there's also an issue with the where
variable in your query.
Firstly, it's important to note that when you initialize the data provider with {idType: "Int"}
, this configuration is supposed to instruct the data provider to treat IDs as integers. However, your query seems to have a mismatch in variable usage which might be causing the issue:
In the query, you've defined a variable $where
of type ID!
, but in the companies
query, you're using $id
which is not defined anywhere in your query. This mismatch is likely causing the GraphQL server to not understand your query correctly, leading to the error message about expecting a value for the non-nullable variable where
.
To address this issue, you should correct the variable in your query to match the defined variable name and ensure it's passed correctly in the variables object of your request. Here's a corrected version of your query:
And ensure your variables object matches this:
Regarding the issue of IDs being treated as strings instead of integers, it's worth noting that GraphQL itself treats all IDs as strings, even if they represent numeric values. This is part of the GraphQL specification to ensure ID uniqueness across different systems. However, if your database schema or GraphQL schema expects an integer, you need to ensure that the conversion or casting is handled appropriately in your resolver or in the way you construct your query.
Unfortunately, based on the extracts provided, there's no direct solution mentioned for converting string IDs to integers within the context of the refine Hasura data provider. If this issue persists, consider reviewing the documentation or source code of the refine Hasura data provider for any additional configuration options or reaching out to the refine community for more specific guidance.
For more detailed information or updates on the Hasura data provider within refine, you might want to check the official documentation or GitHub repository issues for any similar reported issues or updates:
- Refine Hasura Data Provider Documentation (https://refine.dev/docs/examples/data-provider/hasura)
- Refine GitHub Issues (https://github.com/refinedev/refine/issues)
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------<@309676512054083584> kapa.ai is still learning and improving, please let us know how it did by reacting below
harsh-harlequinOP•9mo ago
@kapa.ai
I've updated into this
export const COMPANY_TITLE_QUERY = gql
query CompanyTitle($id: Int_comparison_exp) {
companies(where: {id: $id}) {
id
{errors: [{message: "expected an object for type 'Int_comparison_exp', but found a string",…}]}
errors
:
[{message: "expected an object for type 'Int_comparison_exp', but found a string",…}]
0
:
{message: "expected an object for type 'Int_comparison_exp', but found a string",…}
extensions
:
{path: "$.selectionSet.companies.args.where.id", code: "validation-failed"}
message
:
"expected an object for type 'Int_comparison_exp', but found a string"
name
createdAt
avatarUrl
salesOwner {
id
name
avatarUrl
}
}
}
;
But i get this nowLet me check the knowledge base for you. One moment! :books:
----------------------
Based on the updated query and the error message you've received, it looks like the issue is related to how you're using the
Int_comparison_exp
in your GraphQL query. The error message indicates that the GraphQL server expected an object for the type Int_comparison_exp
, but a string was provided instead. This suggests a mismatch between the expected input type for the id
field in your where
clause and the actual value you're providing.
The Int_comparison_exp
is typically used in Hasura for providing complex filters that allow for operations like less than, greater than, etc., on integer fields. When you specify $id: Int_comparison_exp
as the type for your variable, you need to provide an object that matches this expected structure.
Here's a corrected approach to using Int_comparison_exp
in your query:
And when you're calling this query, you need to ensure that the $id
variable is passed as an object that matches the Int_comparison_exp
expectations. For example, if you're looking for a company with the ID equal to 21, your variables should look something like this:
This structure tells Hasura to look for companies where the id
is equal to 21, matching the Int_comparison_exp
input type's requirements.
Remember, the exact structure of the Int_comparison_exp
might vary based on your GraphQL schema and the configurations in your Hasura instance. If you're unsure about the structure or how to use it, consulting the Hasura documentation specific to your version or exploring the schema in the Hasura console can provide more insights.
Unfortunately, without direct extracts related to handling Int_comparison_exp
in the context of refine or Hasura from the provided information, this is the best guidance I can offer based on standard GraphQL and Hasura practices. If this doesn't resolve your issue, I recommend checking the Hasura documentation or seeking further assistance from the refine community or Hasura support channels.
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------<@309676512054083584> kapa.ai is still learning and improving, please let us know how it did by reacting below
harsh-harlequinOP•9mo ago
@kapa.ai
So how i make sure it's being sent like this in my query?
{
"id": {
"_eq": 21
}
}
Let me check the knowledge base for you. One moment! :books:
----------------------
To ensure your query sends the
id
in the format {"id": {"_eq": 21}}
, you need to adjust both your GraphQL query and the way you pass variables to it. Since the extracts provided don't include specific examples of executing a GraphQL query with variables in the context of refine or a similar environment, I'll guide you based on general GraphQL practices.
First, ensure your GraphQL query is correctly set up to accept an object for the id
field, as shown in the previous response. Here's the query again for reference:
Next, when you're executing this query, you'll need to structure your variables to match the expected format. This step depends on how you're making the GraphQL request. If you're using a GraphQL client library (like Apollo Client, URQL, or even a simple fetch API call), you'll pass the variables along with your query.
Here's an example of how you might do this with a generic GraphQL client or a fetch API call:
Or, if you're using a fetch API directly, it might look something like this:
Remember to replace 'YOUR_GRAPHQL_ENDPOINT'
with the actual endpoint of your GraphQL server.
This approach ensures that your query is executed with the id
variable structured as an object, matching the Int_comparison_exp
type's requirements. Keep in mind that the exact implementation might vary based on the specifics of your GraphQL client or setup.
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------<@309676512054083584> kapa.ai is still learning and improving, please let us know how it did by reacting below
harsh-harlequinOP•9mo ago
@kapa.ai
This is part of the schema
"Boolean expression to compare columns of type "Int". All fields are combined with logical 'AND'."
input Int_comparison_exp {_eq: Int
_gt: Int
_gte: Int
_in: [Int!]
_is_null: Boolean
_lt: Int
_lte: Int
_neq: Int
_nin: [Int!]
}
And this is the query
export const COMPANY_TITLE_QUERY = gql
query CompanyTitle($id: Int_comparison_exp!) {
companies(where: {id: $id}) {
id
name
createdAt
avatarUrl
salesOwner {
id
name
avatarUrl
}
}
}
;Let me check the knowledge base for you. One moment! :books:
----------------------
Based on the schema information you've provided and the query you're using, it looks like you're correctly set up to use the
Int_comparison_exp
for filtering in your Hasura GraphQL query. The Int_comparison_exp
input type allows you to perform various comparisons on columns of type Int
, using fields like _eq
, _gt
, _gte
, etc., all combined with a logical 'AND'.
Given the schema snippet:
And your query:
To use this query effectively, you need to pass a variable that matches the Int_comparison_exp
structure when executing the query. For example, if you want to find companies with an id
equal to 21, your variables object should look like this:
This tells Hasura to filter the companies
where the id
is equal to 21.
Here's how you might execute this query with a GraphQL client, assuming you're using Apollo Client:
This example uses Apollo Client's useQuery
hook to execute the COMPANY_TITLE_QUERY
, passing the id
variable as required. Adjust the implementation according to your setup and the GraphQL client you're using.
Remember, the exact way you execute the query might vary depending on the GraphQL client and the environment (React, Vue, Angular, etc.) you're working in. The key is to ensure that the variables you pass to the query match the expected structure defined by your GraphQL schema.
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------<@309676512054083584> kapa.ai is still learning and improving, please let us know how it did by reacting below
harsh-harlequinOP•9mo ago
@kapa.ai
I am abit stuck with the onChange, onFinish and useform components
Below is the code
const TitleInput = ({
value,
onChange,
loading,
}: {
// value is set by <Form.Item />
value?: string;
onChange?: (value: string) => void;
loading?: boolean;
}) => {
return (
<Text
className={styles.title}
size="xl"
strong
editable={{
onChange,
triggerType: ["text", "icon"],
icon: <EditOutlined className={styles.titleEditIcon} />,
}}
>
{loading ? (
<Skeleton.Input size="small" style={{ width: 200 }} active />
) : (
value
)}
</Text>
);
};
With the query:
export const COMPANY_TITLE_FORM_MUTATION = gql
mutation CompanyTitleForm($set: companies_set_input!, $where: companies_bool_exp!) {
update_companies(_set: $set, where: $where) {
returning {
id
name
avatarUrl
user {
id
name
avatarUrl
}
}
}
}
;
And my payload looks like this
operationName
:
"CompanyTitleForm"
query
:
"mutation CompanyTitleForm($set: companies_set_input!, $where: companies_bool_exp!) {\n update_companies(_set: $set, where: $where) {\n returning {\n id\n name\n avatarUrl\n user {\n id\n name\n avatarUrl\n }\n }\n }\n}\n"
variables
:
{id: "21", object: {salesOwnerId: 1}}
id
:
"21"
object
:
{salesOwnerId: 1}
salesOwnerId
:
1
Which seems right but gives this error
{errors: [{message: "expecting a value for non-nullable variable: "set"",…}]}
errors
:
[{message: "expecting a value for non-nullable variable: "set"",…}]
0
:
{message: "expecting a value for non-nullable variable: "set"",…}
extensions
:
{path: "$", code: "validation-failed"}
message
:
"expecting a value for non-nullable variable: "set""
I am also using an Hasura provider for this, why is that?Let me check the knowledge base for you. One moment! :books:
----------------------
Based on the information provided, it seems like you're encountering an issue with a GraphQL mutation when trying to update company information using Hasura. The error message you're receiving indicates that the mutation expects a value for a non-nullable variable named
set
, but it's not receiving one in the payload you're sending.
The mutation you've shared is:
And the payload looks like this:
The error message you're receiving is:
The issue here seems to be with how the variables are structured in your payload. The mutation expects two variables: $set
and $where
. However, in your payload, you're providing an id
and an object
with salesOwnerId
inside it. It looks like there's a mismatch between what your mutation expects and what you're providing.
To resolve this issue, you need to adjust your payload to correctly map to the $set
and $where
variables expected by the mutation. Here's how you might structure your variables correctly:
In this corrected payload, the set
variable is an object that contains the fields you want to update, and the where
variable is an object that specifies the condition for which company(s) to update. Note that the where
condition uses the _eq
operator to specify that you want to update the company with an id
equal to 21
.
Please ensure that the structure of the set
and where
variables matches what your GraphQL schema expects. The exact structure might vary based on your schema definitions in Hasura.
Remember, the key to resolving this issue is ensuring that the variables you provide in your payload match the expectations of your GraphQL mutation, both in terms of naming and structure.
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------<@309676512054083584> kapa.ai is still learning and improving, please let us know how it did by reacting below
harsh-harlequinOP•9mo ago
@kapa.ai
Thanks i am aware of that, but isn't that how i've structured it in my query?
export const COMPANY_TITLE_FORM_MUTATION = gql`
mutation CompanyTitleForm($set: companies_set_input!, $where: companies_bool_exp!) {
update_companies(_set: $set, where: $where) {
returning {
id
name
avatarUrl
user {
id
name
avatarUrl
}
}
}
}
Let me check the knowledge base for you. One moment! :books:
----------------------
It appears there's been a misunderstanding regarding the structure of the variables in your payload based on the mutation you've provided. Let's clarify the structure required by your mutation and how it should be reflected in your payload.
Your mutation is defined as follows:
This mutation expects two variables:
-
$set
: An object of type companies_set_input
, which contains the fields you want to update.
- $where
: An object of type companies_bool_exp
, which specifies the condition to match the companies you want to update.
From the error message and the payload you've shared, it seems the issue is with how the variables are being passed in the payload, not necessarily with the structure of the mutation itself. The error indicates that the set
variable is missing or not correctly structured.
Your payload should look something like this:
However, based on the error message and the provided context, it seems there might have been a miscommunication or misunderstanding in how you've structured the payload. The payload you've thought you were sending does not seem to match what the server expects or what you've intended based on the mutation's requirements.
To ensure clarity, when you execute this mutation, make sure that the variables you pass to it are structured correctly, as shown in the corrected payload example above. This structure directly maps to the $set
and $where
variables defined in your GraphQL mutation.
If you're still encountering issues, double-check the way you're constructing and sending the payload in your application code. Ensure that the variables
object in your request precisely matches the structure expected by your GraphQL server, as outlined in the mutation definition.
Without the exact code snippet showing how you're executing the mutation (e.g., using Apollo Client, fetch API, etc.), it's challenging to provide more specific guidance. However, the key takeaway is to ensure the structure and content of the variables
object in your request match what the mutation expects.
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------<@309676512054083584> kapa.ai is still learning and improving, please let us know how it did by reacting below
Let me check the knowledge base for you. One moment! :books:
Sorry @Konungariket Sverige, I am experiencing especially high traffic right now, please try again. :technologist:
harsh-harlequinOP•9mo ago
@kapa.ai
I think the problem is that the Hasura dataprovider is passing the id as a string instead of an Int!
Here is the payload
{,…}
operationName
:
"CompanyTitleForm"
query
:
"mutation CompanyTitleForm($pk_columns: companies_pk_columns_input!, $_set: companies_set_input!) {\n update_companies_by_pk(pk_columns: $pk_columns, _set: $_set) {\n id\n name\n avatarUrl\n user {\n id\n name\n avatarUrl\n }\n }\n}\n"
variables
:
{id: "2", object: {salesOwnerId: 3}}
id
:
"2"
object
:
{salesOwnerId: 3}
salesOwnerId
:
3
Giving this error
{errors: [{message: "expecting a value for non-nullable variable: "pk_columns"",…}]}
errors
:
[{message: "expecting a value for non-nullable variable: "pk_columns"",…}]
0
:
{message: "expecting a value for non-nullable variable: "pk_columns"",…}
extensions
:
{path: "$", code: "validation-failed"}
message
:
"expecting a value for non-nullable variable: "pk_columns""
From the schema
"primary key columns input for table: companies"
input companies_pk_columns_input {id: Int!
}
And also this is how i set my dataprovider, into an Int type, but still not working, or maybe i am way off?
const gqlDataProvider = dataProvider(client, {idType: "Int"});
Let me check the knowledge base for you. One moment! :books:
----------------------
Based on the details you've provided, it seems there's a misunderstanding in how the variables are structured for your GraphQL mutation, especially in relation to the
pk_columns
variable expected by your mutation. The error message indicates that the mutation expects a non-nullable variable named pk_columns
, but it's not receiving it in the expected format. Let's address this issue step by step.
Understanding the Error
The error message:
This indicates that the mutation expects a variable named pk_columns
which is not being correctly provided in your payload.
Correct Payload Structure
Given the mutation:
And the schema:
Your payload should be structured as follows:
Key Points
- The pk_columns
variable must be an object that includes the id
field with an integer value, matching the companies_pk_columns_input
input type from your schema.
- The id
value in your original payload is a string ("2"
), but it should be an integer (2
) as per the schema definition.
- The object
key in your original payload does not match the expected variable names (pk_columns
and _set
). It should be replaced with the correct structure as shown above.
Regarding the idType: "Int"
Configuration
Your configuration:
This configuration indicates to the data provider that ID fields should be treated as integers. However, the issue with your payload is not just about the data type of the id
but also about the structure of the variables being passed to the mutation. The data provider configuration specifies the expected data type for ID fields but does not automatically adjust the structure of the variables in your mutation.
Conclusion
Ensure that when constructing payloads for mutations, the structure of the variables matches exactly what the mutation expects, including the correct naming and data types of variables. This alignment is crucial for the successful execution of mutations in GraphQL, especially when working with strongly typed systems like Hasura.
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------