Функция устранения мутации обновления ошибки GraphQL для \ User.id \ вернула undefined

Я новичок в GraphQL и пытаюсь написать мутацию обновления. Тем не менее, я получаю функцию разрешения для ошибки \ "User.id \" вернул undefined ", хотя база данных фактически обновлена.

Что я делаю неправильно?

userSchema.js:

import Sequelize from 'sequelize';
import SqlHelper from '../helpers/sqlhelper';

const config = require('../../config');

const sequelizer = new SqlHelper(config).Init();


const createUser = sequelizer.define(
  'createUser',
  {
    ...
    }
);
const updateUser = sequelizer.define(
  'updateUser',
  {
    id: {
      type: Sequelize.UUID,
      field: 'Id',
      primaryKey: true,
      defaultValue: Sequelize.UUIDV4,
    },
    username: {
      type: Sequelize.STRING,
      field: 'Username',
      allowNull: true,
    },    
    email: {
      type: Sequelize.STRING,
      field: 'Email',
      allowNull: true,
    },
    firstname: {
      type: Sequelize.STRING,
      field: 'FirstName',
      allowNull: true,
    },
    lastname: {
      type: Sequelize.STRING,
      field: 'LastName',
      allowNull: true,
    },
   ....
  },
  {
    // define the table's name
    tableName: 'Users',
  },
);

module.exports = User;

UserResolver.js:

import User from '../dbschemas/user';
import Sequelize from 'sequelize';
const Op = Sequelize.Op;

export default {
  
  Mutation: {
    createUser: async (obj, args) =>
      (await User.create(args)),
    updateUser: async (obj, args) =>
      (await User.update(args,
        {
          where: {
            id: args.id,
          },
          returning: true
        }))

  }
};

Хотя вызов updateUser из GraphiQL обновляет записи (в db), это приводит к ошибке «Функция разрешения для \" User.id \ "вернула неопределенное значение»:

mutation{
  updateUser(id: "2ecd38ca-cf12-4e79-ac93-e922f24af9e3", 
    username: "newUserTesting",  
    email: "[email protected]",     
    lastname: "TestUserLName", 
    firstname: "fname1") {
   id
  } 
}

{
  "data": null,
  "errors": [
    {
      "message": "Resolve function for \"User.id\" returned undefined",
      "locations": [
        {
          "line": 16,
          "column": 4
        }
      ],
      "path": [
        "updateUser",
        "id"
      ]
    }
  ]
}


person user3520042    schedule 14.11.2017    source источник
comment
Что произойдет, если вы вернете другое поле из мутации, отличной от id? Возможно, вместо этого попробуйте firstname.   -  person Andrija Ćeranić    schedule 15.11.2017
comment
та же ошибка: функция разрешения для \ User.firstname \ вернула undefined   -  person user3520042    schedule 15.11.2017


Ответы (2)


Проблема ясна, ваш преобразователь не возвращает объект, содержащий id. В документации говорится, что Model.update возвращается массив, в котором 2-й элемент является затронутой строкой. Следовательно, ваш преобразователь должен выглядеть так:

async updateUser(obj, args) {
  const resultArray = await User.update( ... )
  return resultArray[1]
}

... Чтобы заменить все, что вам нужно.

person Bear-Foot    schedule 15.11.2017
comment
добавлен console.log ('resultArray', resultArray); производит: resultArray [undefined, 1] И я получаю ту же ошибку, что и раньше! - person user3520042; 16.11.2017
comment
Кроме того, в документах есть еще одно обновление: общедоступное обновление (обновления: Object, options: Object): Promise ‹this› - person user3520042; 16.11.2017
comment
Еще есть returning: true? У вас все еще есть ошибка, потому что при возврате 1wich не имеет свойства id - person Bear-Foot; 16.11.2017
comment
При возврате: true удаляется, console.log ('resultArray', resultArray); выходы: resultArray [1]. 1 - количество записей, он не возвращает оба элемента в массиве. Если я обновляю 7 записей, регистрируется resultArray [7]. Если я добавлю return: true, в журнал будет записан esultArray [undefined, 7]. В документации говорится, что первый элемент в массиве - это connectedCount, а второй - disabledRows ... похоже, наоборот, не означает, что затронутые строки не определены. - person user3520042; 16.11.2017

Таким образом, очевидно, что обновление НЕ возвращает затронутые строки для MSSQL, а только количество затронутых записей.

Это верно только для postgres при возврате: true:

public static update(values: Object, options: Object): Promise<Array<affectedCount, affectedRows>>

Настройка return: true (для MSSQL) возвращает undefined (и порядок параметров в массиве даже не в правильном порядке ... т.е. сначала затронутые строки -> неопределенные, затем затронутые строки -> количество затронутых строк.)

Чтобы вернуть объект, вам нужно будет сделать что-то вроде этого:

Mutation: {
createUser: async (obj, args) =>
  (await User.create(args.user)),
updateUser: async (obj, args, context, info) =>{        
  let user = args.user;
  let response = await User.update(user,
      {
        where: {
          [Op.or]: [{ email: user.email }, { id: user.id }, { username: user.username }, { lastname: user.lastname}]
        },
        //returning: true //not working... only for postgres db :(
      }).then(ret => {   
        console.log('ret', ret);         
        return ret[0];
      }).catch(error => {
        console.log('error', error)
      });

  if (response > 0) return user; //return record 

  //return response > 0; //return true
}      

}

person user3520042    schedule 21.11.2017