Почему findAll () возвращает не все объекты в модели?

#node.js #mocha.js #sequelize.js

#node.js #mocha.js #sequelize.js

Вопрос:

Я работаю над издевательской базой данных, потому что я модульное тестирование API. Для макетирования я использую библиотеку sequelize-mock, а для моделей я использую sequelize. Когда я вызываю GET-запрос, функция GetAll() возвращает только первый элемент в этом массиве.

Моя макет модели:

 const assetmeter = (sequelize) => {
  const AssetMeter = sequelize.define('assetmeter', {
    id: 1,
    assetId: 1,
    sequence: null,
    meterName: 'BAD',
    measureUnit: 'km',
    meterType: 'CHARACTERISTIC', 
    description: 'test description', 
    active: true,
  },{
    id: 2,
    assetId: 2,
    sequence: null,
    meterName: 'TEST',
    measureUnit: 'TEST',
    meterType: 'TEST', 
    description: 'TEST', 
    active: true,
  });

  return AssetMeter;
}

module.exports = assetmeter;
  

Получить всю функцию:

 import { AssetMeter } from '../../models';
import paginate from '../../utils/paginate';

export default async (req, res) => {
  let assetMeters = [];
  try {
    assetMeters = await AssetMeter.findAndCountAll({
      limit: req.pagination.limit, 
      offset: req.pagination.offset
    });
    console.log(assetMeters);
  } catch (err) {
    console.log(err);
    return res.status(500).send({ error: 'Internal server error' });
  }
  const links = paginate(req.protocol, req.hostname, req.baseUrl, req.pagination, assetMeters.count);
  if (links) {
    res.set('Link', links);
  }
  return res.set('X-Total-Count', assetMeters.count).send(assetMeters.rows);
}; 
  

Я ожидаю, что результат вернет два объекта в массиве.
Текущий результат:

 [ { id: 1,
    assetId: 1,
    sequence: null,
    meterName: 'BAD',
    measureUnit: 'km',
    meterType: 'CHARACTERISTIC',
    description: 'test description',
    active: true,
    createdAt: '2019-03-29T07:33:02.812Z',
    updatedAt: '2019-03-29T07:33:02.812Z' } ]
  

Комментарии:

1. Каково значение req.pagination.limit и req.pagination.offset ?

2. Значение @bird для нумерации страниц равно 100, смещение равно 0

3. пожалуйста, поделитесь sql-командой, сгенерированной из findAndCountAll. добавьте опцию «log: console.log» точно так же, как параметры ограничения смещения.

4. @RohitDalal я ничего не получил, я думаю, у sequelize нет этой функции

5. В вашем терминале будет создан журнал sql-запроса

Ответ №1:

Боюсь, это ожидаемый результат, я думаю, вы используете define неправильный путь. Есть 2 вещи.

Во-первых, сигнатура метода:

 define(name, [obj={}], [opts]) -> Model
  

Вы передаете 3 аргумента, но допустим только 2-й. Это объект, содержащий значения по умолчанию для AssetMeter . Следовательно, 3-й аргумент игнорируется, потому что так и должно быть opts .

Во-вторых, вы пытаетесь заполнить свой макет многими AssetMeter , но для этого вам нужно вставить (создать) их. Опять же, второй аргумент — это значения по умолчанию для свойств AssetMeter (id, AssetID и т.д.).

Вот почему ваш findAll возвращает только 1 результат, это объект с такими значениями по умолчанию.

Я думаю, что лучший способ сделать это, если вам нужны 2 объекта, — это имитировать запрос с помощью $queueResults :

 const DEFAULT_VALUE: { /*...*/ };

const assetmeter = (sequelize) => {

  const AssetMeter = sequelize.define('assetmeter', DEFAULT_VALUE);

  AssetMeter.$queueResult([UserMock.build(), UserMock.build(), /* ... */]);

  return AssetMeter;
}

module.exports = assetmeter;
  

Взгляните на документы:https://sequelize-mock.readthedocs.io/en/stable/docs/mock-queries/#queued-results.

Я надеюсь, это поможет!