【问题标题】:GraphQL error Cannot perform update queryGraphQL错误无法执行更新查询
【发布时间】:2021-08-01 04:38:42
【问题描述】:

我正在使用 NodeJS、Koa 和 GraphQL 开发一个 ToDo 列表应用程序。 我写了一个更新卡突变,但是当我运行查询更新时,我收到以下错误:

Cannot perform update query because update values are not defined. Call "qb.set(...)" method to specify updated values.

突变:

import { getRepository } from 'typeorm';
import { Card } from '../../entities/card';

export const updateCardMutation = {
    async updateCard(_, { id, patch }): Promise<Card> {
        const repository = getRepository(Card);
        const card = await repository.findOne({ id });
        const result = await repository.update(id, patch);
        return {
            ...card,
            ...patch,
        };
    },
};

我想知道我做错了什么,如果需要更多信息,请通知我,以便我相应地编辑问题

卡片实体:

import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';

@Entity('cards')
export class Card {
    @PrimaryGeneratedColumn('uuid')
    id: string;

    @CreateDateColumn()
    created_at: Date;

    @UpdateDateColumn()
    updated_at: Date;

    @Column('text')
    title: string;

    @Column('text', {
        nullable: true,
    })
    description: string;

    @Column('boolean', {
        default: 'false',
    })
    done: boolean;
}

【问题讨论】:

    标签: node.js graphql


    【解决方案1】:

    你需要传播更新对象。

    export const updateCardMutation = {
    async updateCard(_, { id, patch }): Promise<Card> {
        const repository = getRepository(Card);
        const card = await repository.findOne({ id });
        const result = await repository.update(id, {...patch}); // here
        return {
            ...card,
            ...patch,
        };
    },
    

    };

    【讨论】:

      【解决方案2】:

      问题是当我调用updateMutation 时,它正在创建匿名类型的补丁对象。所以它只需要在进入数据库引擎之前清理干净

      我通过添加以下代码解决了我的问题:

      { ...patch }
      

      在下一个脚本中:

      export const updateCardMutation = {
          async updateCard(_, { id, patch }): Promise<Card> {
              const repository = getRepository(Card);
              const card = await repository.findOne({ id });
              const result = await repository.update(id, { ...patch }); // Added here
              return {
                  ...card,
                  ...patch,
              };
          },
      };
      

      通过这种方式,我能够更新我的卡。

      【讨论】:

        【解决方案3】:

        https://github.com/typeorm/typeorm/blob/master/docs/update-query-builder.md

        作为错误调用 qb.set() ,typeorm 查询生成器与其他 orm 不同

        await getRepository().createQueryBuilder().update(Card).set(patch)
        .where("id = :id", { id })
        .execute();
        

        补丁对象如何将 [object] 字符串化,因此您可以像 set({...patch}) 一样传播它

        【讨论】:

        • 不幸的是,这给出了与以前相同的错误并且没有更改
        • 我还建议你传播对象,但这是第二种选择
        【解决方案4】:

        我之前的更新查询是 nestjsgraqhql 时遇到过这个错误

        由于未定义更新值,无法执行更新查询

        我已通过使用同一 ID 上的存储库中的 save() 函数修复它,因此我已对此进行了更改

        async update(
            id: number,
            updateEmployeeInput: UpdateEmployeeInput,
          ): Promise<Employee> {
            await this.employeeRepository.update(id, updateEmployeeInput);
            return this.employeeRepository.findOneOrFail(id);
          }
        

        到这里

        async update(
            id: number,
            updateEmployeeInput: UpdateEmployeeInput,
          ): Promise<Employee> {
            await this.employeeRepository.save(updateEmployeeInput)
            return this.employeeRepository.findOneOrFail(id);
          }
        

        【讨论】:

          猜你喜欢
          • 2021-03-08
          • 2017-01-23
          • 2011-10-03
          • 2017-07-27
          • 2020-12-04
          • 2017-01-16
          • 2020-08-18
          • 1970-01-01
          • 2016-06-13
          相关资源
          最近更新 更多