Sequelize Ассоциации: необработанное отклонение TypeError: order.addItems не является функцией - PullRequest
0 голосов
/ 20 января 2020

Ассоциация определяется как:

Orders.belongsToMany(Items, { through: OrderItem });
Items.belongsToMany(Orders, { through: OrderItem });

Я пытаюсь

 Orders.create(orderDetails).then(order => {
            orderDetails.items.forEach(item => {
                Items.findByPk(item.code).then(item => {
                    order.addItem(item)
                })
            });    
        })

Почему это дает мне ошибку,

Unhandled rejection TypeError: order.addItem is not a function

1 Ответ

0 голосов
/ 22 января 2020

должно работать. Я использую "sequelize": "^5.21.3". Кроме того, есть еще одна проблема с вашим кодом. Вы создаете заказ, но sequelize не создаст items в orderDetails объекте. Вы должны создать их с ассоциациями. Вы должны создавать предметы, используя Orders.create(orderDetails, { include: [Items] }). Вы можете проверить это документы для деталей.

Давайте go вернемся к вашему вопросу, order.addItem должно работать. Вот завершенный рабочий пример:

index.ts:

import { Model, BelongsToManyAddAssociationMixin, DataTypes } from 'sequelize';
import { sequelize } from '../../db';

class Orders extends Model {
  public id!: number;
  public addItem!: BelongsToManyAddAssociationMixin<Items, number>;
}
Orders.init({}, { sequelize, modelName: 'order' });

class Items extends Model {
  public code!: number;
  public name!: string;
}
Items.init(
  {
    code: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
    },
    name: DataTypes.STRING,
  },
  { sequelize, modelName: 'item' },
);

class OrderItem extends Model {
  public orderId!: number;
  public itemCode!: number;
}
OrderItem.init({}, { sequelize, modelName: 'orderItem' });

Orders.belongsToMany(Items, { through: OrderItem });
Items.belongsToMany(Orders, { through: OrderItem });

export { sequelize, Orders, Items, OrderItem };

index.test.ts:

import { sequelize, Orders, Items } from './';

describe('59818484', () => {
  beforeAll(async () => {
    await sequelize.sync({ force: true });
  });
  afterAll(async () => {
    await sequelize.close();
  });
  it('should pass', (done) => {
    expect.assertions(3);
    const orderDetails = {
      items: [
        { code: 1, name: 'a' },
        { code: 2, name: 'b' },
      ],
    };
    let count = 0;
    Orders.create(orderDetails).then(async (order: Orders) => {
      const items = await Items.findAll();
      expect(items).toHaveLength(0);
      orderDetails.items.forEach((item) => {
        Items.findByPk(item.code)
          .then((item: Items) => {
            expect(typeof order.addItem).toBe('function');
            return order.addItem(item);
          })
          .finally(() => {
            count++;
            if (count === orderDetails.items.length) {
              done();
            }
          });
      });
    });
  });
});

Результаты интеграционных испытаний:

 PASS  src/examples/stackoverflow/59818484/index.test.ts
  59818484
    ✓ should pass (34ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.23s

Исходный код: https://github.com/mrdulin/node-sequelize-examples/tree/master/src/examples/stackoverflow/59818484

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...