有人可以告诉我为什么我的POST方法没有通过Mongoose保存到我的MongoDB吗?
My Angular controller
$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,但是当它到达Angular核心代码时,它会恢复到原始状态而不更新数据库。也没有错误。
答案 0 :(得分:1)
上面的代码有一些问题:
req.params
对象传递到_id
字段而不是req.params.entry_id
findByIdAndUpdate()
的方式不正确$http.post()
中发送,但您希望req.body
包含路线中的数据 req.params
指向请求中的整个params
对象。你只想从参数中获取ID,然后将其传递给你的猫鼬模型。
假设你正在传递entry_id
,那么你将通过你的第一个条件if(req.params)
,因为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);
});
此外,请勿在您的承诺链that approach is deprecated中使用.success()
。在处理您的回复时,您应该使用A +标准.then()
和.catch()
。