Возврат объекта вместо массива одного объекта в Sequelize - PullRequest
0 голосов
/ 20 января 2020

Безуспешно ищу похожие вопросы. В настоящее время у меня есть приложение Angular и сервер NodeJS / Express, и я использую Sequelize для MariaDB.

У меня есть таблица I хочу собрать статистику и вернуть как простой объект.

getPlayerStats = function(callback) {
  Player.findAll({
    attributes: [
      [sequelize.fn('sum', sequelize.col('points')), 'totalPointsEarned'],
      [sequelize.fn('count', sequelize.col('id')), 'totalPlayers'],
      [sequelize.fn('sum', sequelize.col('online')), 'totalOnline']
    ]
  }).then(playerStats => callback(playerStats));
};

'

  app.get("/info/player-stats", function(request, response) {
    sql.getPlayerStats(result => response.send(result));
  });

Это дает мне следующий вывод:

[
    {
        "totalPointsEarned": 457,
        "totalPlayers": 5,
        "totalOnline": 2
    }
]

Это вызывает проблемы при отображении данных в DOM, если я обработаю их как объект, Angular ничего не отобразит. Если я обработаю его как массив с *ngFor='let player of players', он отобразит данные в DOM, но выдаст ошибку:

ERROR Error: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays

Если , я получу следующий вывод: {}

{
    "totalPointsEarned": 457,
    "totalPlayers": 5,
    "totalOnline": 2
}

.. вместо [{}] я считаю, что мне будет проще отобразить данные в DOM.

я считаю, что мне будет нужно изменить что-то в первой партии кода, размещенной здесь (часть Sequelize), чтобы получить взамен один объект вместо массива только с одним объектом. Любые советы или предложения приветствуются.

Заранее спасибо, Сванте

1 Ответ

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

Это зависит от ваших потребностей.
findAll возвращает массив, потому что вы хотите найти все случаи, совпадающие с запросом (так что это может быть несколько объектов в массиве).
Если ваш запрос всегда возвращает один объект, который вы можете использовать find вместо findAll, и тогда вы получите объект.

В противном случае просто используйте функции [].map() или [].forEach на вашем бэкэнде, чтобы получить доступ к любому объекту внутри массив.

...