MEAN在这里堆叠新手。我很难理解删除在MEAN中是如何工作的。我使用此SO Q&A和tutorial作为指南,但每当我测试它时,我都会收到错误消息,说明数据无法删除。有人可以告诉我,我做错了什么吗?
以下是我的代码:
控制器JS
$scope.deleteProduct = function (value, idx) {
var this_id = value._id;
// delete
$http.delete('/api/products/delete:' + this_id)
.success(function (data) {
console.log(data);
})
.error(function (data) {
console.log('Error: ' + data);
})
}
节点服务器
app.delete('/api/products/delete:', productController.delete);
服务器"控制器"
module.exports.delete = function (req, res) {
Service.remove({
_id: req.params._id
}, function (err, service) {
if (err) {
res.send(err);
}
else {
res.json({message: "Delete successful."});
}
});
}
这就是我理解这一点的方式。这是对的吗?
控制器JS 获取要删除的ID,并使用所述ID和/api/products/delete:
调用$ http的删除请求(?)。
节点服务器看到我打电话给' / api / products / delete:'并将请求传递给服务器的控制器以完成请求。
服务器控制器删除数据并返回状态。
我哪里出错了?请帮忙。
另外,我一直看到一些帖子说$resource
比$http
效果更好。为什么?
谢谢。
答案 0 :(得分:1)
我认为你在这里遇到了一些错误。
在Express中,为了使用params
,你需要在路线中有一些可以替换的东西。即/api/:id
表示将:id
替换为您传入的内容,因此如果您发送/api/1
,则request.params.id
为1
首先问题是你的路线是
app.delete('/api/products/delete:', productController.delete);
对于快递来说意味着什么。我想你想要
app.delete('/api/products/:id', productController.delete);
现在req.params.id
应包含您发送的参数。注意我在这里删除下划线。你可以用
app.delete('/api/products/:_id', productController.delete);
如果您愿意,请保留下划线。
我认为第二个错误就是你的角色代码。你的电话中有:
,它应该是
$http.delete('/api/products/' + this_id)
现在您正在发送包含您要删除的ID的路由,即
/api/products/1
现在Express得到了它,可以将它映射到/api/products/:id
并替换id,现在你的控制器应该工作。禁止任何其他问题。
修改强>
我对Angular不是很熟悉,但我认为人们说使用$resource
的原因是它更容易。您可以直接在对象本身对象上直接调用不同的HTTP谓词
product.update
和product.delete
而不是尝试自己制作http电话。我确信它还有很多东西,但它可以利用Angular内置的功能。我认为其中一个问题是资源的URL只需要在服务器上设置一个特定的方式,但我相信有一种方法可以在Angular中覆盖它们。