API локального узла не размещается в базе данных Mongoose

0

Может кто-нибудь, пожалуйста, скажите мне, почему мой метод POST не сохраняется в моем MongoDB через Mongoose?

Мой угловой контроллер

$scope.saveUpdate = function(id){
    $http.post('/api/entry/' + id)
        .success(function(data){
            $scope.entry = data;
        })
        .error(function(data){
            console.log('There was a problem saving your entry: ' + data);
        });
    // update page with remaining entries
    $http.get('/api/entries').then(function(response){
        $scope.entries = response.data;
    });
}

Мой API

app.post('/api/entry/:entry_id', function(req, res){
    if (req.params) {
      Entries.findByIdAndUpdate({
        _id : req.params,
        // the properties we're updating and the new values
        username: req.body.username,
        date: req.body.date,
        income: req.body.income
      }, function(err, entry){
        if (err) {
          res.send(err) }
          else {
            res.send('Success!');
          }
      })
    }
});

Кнопка отправки в представлении

<button type="submit" class="btn" ng-click="saveUpdate(entry._id)">Update</button>

Обновленная запись попадает в DOM при нажатии кнопки, но когда она попадает в код углового ядра, она возвращается обратно в исходное состояние без обновления БД. Ошибок не возникает.

Теги:
mean-stack
express

1 ответ

1
Лучший ответ

В приведенном выше коде есть несколько ошибок:

  1. Весь req.params объект передается в _id поле вместо req.params.entry_id
  2. Способ передачи параметров findByIdAndUpdate() неверен
  3. Тело запроса никогда не отправляется в ваш $http.post() но вы ожидаете, что req.body будет содержать данные на вашем маршруте

req.params указывает на весь объект params по запросу. Вы только хотите получить идентификатор из параметров, а затем передать это в свою модель мангуста.

Предполагая, что вы проходите в entry_id вы передадите свое первое условие, if(req.params) поскольку параметры действительно будут существовать. Тем не менее, когда вы передаете req.params в _id поля вашей Entries модели вы на самом деле прохождение всего объекта { entry_id: '123' } вместо всего 123.

Кроме того, неправильный способ передачи значений методу findByIdAndUpdate. Есть 4 параметра, на которые потребуется findByIdAndUpdate(id, [update], [options], [callback]), id - единственное обязательное поле. Вы передаете весь объект, чтобы найти на основе id и обновить значения в одном аргументе. Вам нужно разбить entry_id из полей, которые вы хотите обновить.

app.post('/api/entry/:entry_id', function(req, res) {

  // Param Existence Checking
  if (!req.params.entry_id)
    return res.status(400).send('an entry_id must be provided');
  if (!req.body.username)
    return res.status(400).send('a username must be provided');
  if (!req.body.date)
    return res.status(400).send('a date must be provided');
  if (!req.body.income)
    return res.status(400).send('an income must be provided');

  var updateData = {
    username: req.body.username,
    date: req.body.date,
    income: req.body.income
  };

  Entries.findByIdAndUpdate(req.params.entry_id, updateData, function(err, entry){
    if (err)
      return res.status(500).send(err)

    return res.status(200).send('Success!');
  })

});

Также на основе кода примера из вашего вопроса я не вижу, где вы передаете значения req.body при выполнении $http.put(). Одно можно сказать наверняка, что если req.body не содержит username, date и income вы получите undefined присвоение этих полей.

Для того, чтобы обеспечить организм запроса через $http.post() передать его в второй парах data.

$http.post('/api/entry/' + id, {
  username: 'username',
  date: new Date(),
  income: 10000.00
})
  .then(function(res, status){ 
    console.log(res.data);
  })
  .catch(function(err) {
    console.log(err);
  });

Кроме того, не используйте .success() в цепочке обещаний, этот подход устарел. Вы должны использовать стандарт A+ .then() и .catch() при обработке вашего ответа.

  • 0
    Я понимаю, что вы говорите. После замены entry_id на мои запросы он, к сожалению, все еще не обновляет БД. Он возвращается к исходной записи, когда completeRequest обратный вызов completeRequest в основном файле angular.js. Понятия не имею, почему это так.
  • 0
    @PanicBus смотрите мой ответ, я обновил вызов Entries.findByIdAndUpdate() в своем ответе. Первые пары должны быть _id Value , чтобы соответствовать , который req.params.entry_id . Второй параметр - это объект полей и их значений для обновления. Вы передаете свои поля для обновления и ваш идентификатор в одном объекте и один параметр, который является неправильным. Model.findByIdAndUpdate Docs
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню