Управление результатом запроса NodeJS

#javascript #node.js #sequelize.js

#javascript #node.js #sequelize.js

Вопрос:

У меня есть сервер NodeJS с множеством вызовов

Один получает всех пользователей:

 export function findAll(req, res) {
    Users.findAll()
        .then(data => {
            res.send(data);
        })
        .catch(err => {
           ...
        });
}
 

И один, чтобы получить пользователя на основе его идентификатора:

 export function findOne(req, res) {
    const userId = req.params.id;
    Users.findByPk(userId)
        .then(data => {
            res.send(data);
        })
        .catch(err => {
           ...
        });
}
 

Работа с результатом поиск всех пользователей работает нормально, и пользователи получают обновленные данные о результате с помощью:

 axios
  .get('https://.../api/users')
  .then (res => {
      this.users = res.data;
  })
 

Но получение пользователя по идентификатору не работает:

 axios
  .get('https://.../api/users/'   id)
  .then (res => {
      this.users = res.data;
  })
 

Из документов я вижу, что данные из findAll возвращают обещание массива <Array< Model >>, но findByPk возвращает обещание объекта< Model> . Таким образом, я получаю это для всех пользователей:

 [ { "id": 1, .... }, {"id": 2, .... } ]
 

Но из-за вызова ID (без скобок [ ]), приводящего к ошибке:

 { "id": 1, .... }
 

Итак, я попытался изменить метод findByPk на:

 const userId = req.params.id;
Users.findAll({where: {id : userId}})
 

но это все равно возвращает объект, а не массив из 1.

Во-первых, почему вызов findAll({where: {id: userId}}) не возвращает массив, как это делает вызов all users ? Во-вторых, если это так, как есть, как мне обновить пользователей с помощью данных объекта? Я пытался:

 var self = this
axios
  .get('https://.../api/users/'   userId)
  .then (res => {
    Object.keys(res.data).forEach(function(key) {
      self.users[key] = res.data[key]
    })
  })
 

безуспешно.

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

1. Предполагается, что ваша конечная точка user-by-id должна возвращать одного пользователя, а не массив. Если вы по какой-то причине все еще хотите сохранить их в массиве, вам следует сделать axios.get('https://.../api/users/' id).then (res => { this.users = [res.data]; }) .

2. @Bergi Отлично — ваш комментарий решает проблему, спасибо. Но почему Users.findAll({where: {id: userId}}) не возвращает ни одного массива из 1? Users.findAll() выполняет, если в БД есть только одна запись.

3. Понятия не имею, насколько я понимаю, так и должно быть, но я не использую mongodb.

4. @Берги Оки доук. Ваш ответ мне очень помог. На самом деле это postgresql. Я тоже не использую монго, так что понятия не имею, как это выглядит. Еще раз спасибо.

5. О, это было похоже на какую-то модель схемы мангуста. Если вы используете postgres, как создается эта модель, что именно это User такое? Какой библиотекой вы пользуетесь?