Может кто-нибудь, пожалуйста, скажите мне, почему мой метод 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 при нажатии кнопки, но когда она попадает в код углового ядра, она возвращается обратно в исходное состояние без обновления БД. Ошибок не возникает.
В приведенном выше коде есть несколько ошибок:
req.params
объект передается в _id
поле вместо req.params.entry_id
findByIdAndUpdate()
неверен$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()
при обработке вашего ответа.
entry_id
на мои запросы он, к сожалению, все еще не обновляет БД. Он возвращается к исходной записи, когдаcompleteRequest
обратный вызов completeRequest в основном файле angular.js. Понятия не имею, почему это так.Entries.findByIdAndUpdate()
в своем ответе. Первые пары должны быть_id
Value , чтобы соответствовать , которыйreq.params.entry_id
. Второй параметр - это объект полей и их значений для обновления. Вы передаете свои поля для обновления и ваш идентификатор в одном объекте и один параметр, который является неправильным. Model.findByIdAndUpdate Docs