使用MEAN堆栈从MongoDB中删除数据

时间:2016-12-31 17:41:11

标签: javascript node.js mongodb mean-stack

MEAN在这里堆叠新手。我很难理解删除在MEAN中是如何工作的。我使用此SO Q&Atutorial作为指南,但每当我测试它时,我都会收到错误消息,说明数据无法删除。有人可以告诉我,我做错了什么吗?

以下是我的代码:

控制器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."});
        }
    });
}

这就是我理解这一点的方式。这是对的吗?

  1. 控制器JS 获取要删除的ID,并使用所述ID和/api/products/delete:调用$ http的删除请求(?)。

  2. 节点服务器看到我打电话给' / api / products / delete:'并将请求传递给服务器的控制器以完成请求。

  3. 服务器控制器删除数据并返回状态。

  4. 我哪里出错了?请帮忙。

    另外,我一直看到一些帖子说$resource$http效果更好。为什么?

    谢谢。

1 个答案:

答案 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.updateproduct.delete而不是尝试自己制作http电话。我确信它还有很多东西,但它可以利用Angular内置的功能。我认为其中一个问题是资源的URL只需要在服务器上设置一个特定的方式,但我相信有一种方法可以在Angular中覆盖它们。