Я создаю проект в React, используя apollo-server-express,graphQL и postgreSQL, я выполнил определения типов, а также некоторые запросы и мутации, но есть 3 конкретных, которые работают неправильно.
Все трое выдают одну и ту же ошибку, поэтому я покажу только одну мутацию. В моем postgreSQL я создал эту таблицу:
CREATE TABLE IF NOT EXISTS tb_evaluator(
id SERIAL NOT NULL,
name VARCHAR(255) NOT NULL,
profession VARCHAR(255) NOT NULL,
performance_exp VARCHAR(20) NOT NULL,
app_exp VARCHAR(20) NOT NULL,
ag_exp VARCHAR(20) NOT NULL,
evaluation_date VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
Затем в своем проекте я создал js-файл с определениями типов, запросами и мутациями.
const { gql } = require('apollo-server-express')
const typedefs = gql`
type Evaluator {
id: ID!
name: String!
profession: String!
performanceExp: String!
appExp: String!
agExp: String!
evaluationDate: String!
}
type Mutation {
addEvaluator(input: AddEvaluatorInput!): Evaluator!
}
input AddEvaluatorInput {
name: String!
profession: String!
performanceExp: String!
appExp: String!
agExp: String!
evaluationDate: String!
}
`;
module.exports = typedefs;
В другом файле я создал преобразователи, в данном случае преобразователь:
const { Pool } = require('pg');
const pool = new Pool({...});
const resolvers = {
Query: {...}
Mutation: {
...
addEvaluator: async (_, { input }) => {
const { name, profession, performanceExp, appExp, agExp, evaluationDate } = input;
const values = [name, profession, performanceExp, appExp, agExp, evaluationDate];
const query = 'INSERT INTO tb_evaluator (name, profession, performance_exp, app_exp, ag_exp, evaluation_date) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *';
try {
const result = await pool.query(query,values);
return result.rows[0];
} catch (error) {
console.error('Error adding evaluation:', error);
throw new Error('Failed to add evaluation');
}
}
}};
Когда я запускаю сервер, я захожу в песочницу сервера Apollo и выполняю эту операцию:
mutation Mutation($input: AddEvaluatorInput!) {
addEvaluator(input: $input) {
id
name
profession
performanceExp
appExp
agExp
evaluationDate
}
}
И во вкладке переменных я установил такие значения:
{
"input": {
"agExp": "a",
"appExp": "b",
"evaluationDate": "c",
"name": "d",
"performanceExp": "e",
"profession": "f"
}
}
Но когда я запускаю его, я получаю эту ошибку
"errors": [
{
"message": "Cannot return null for non-nullable field Evaluator.performanceExp.",
"locations": [
{
"line": 6,
"column": 5
}
],
"path": [
"addEvaluator",
"performanceExp"
],
Но, помимо ошибки, данные все еще вставляются в мою базу данных pg, поэтому я не знаю, игнорирую ли я эту ошибку или делаю что-то не так, потому что у меня есть другие мутации, ОЧЕНЬ похожие, и Единственная разница заключается в количестве параметров. Кстати, когда я использую эти переменные: PerformanceExp, appExp,agExp и AssessmentDate, или когда я статически устанавливаю их значения в коде, который запускается без ошибок,
🤔 А знаете ли вы, что...
React обеспечивает реактивное обновление интерфейса при изменении состояния.
В конце мутации вы запрашиваете в базе данных запись, которую вы только что вставили:
const result = await pool.query(query,values);
return result.rows[0];
Однако вам не удается преобразовать имена столбцов snake_case
обратно в camelCase
— в результате все ваши поля performanceExp, appExp,
и agExp
будут иметь значение null, поскольку сервер GraphQL отбросит performance_exp
и т. д. из записи результата перед созданием набора данных JSON для отправки обратно клиенту.