为什么我必须在$ http angular中将params作为对象发送?

时间:2016-05-31 07:29:48

标签: javascript angularjs

我正在制作CRUD,如果我想将一些数据发送到我的后端(node.js),那么我收到一个错误: angular.js:10765 POST http://localhost:1234/shop/removeProduct/574bf938b16158b40f9c87bc 400 (Bad Request)

脚本:

$scope.removeProduct = function (partnerId, productId) {
    $http.post("/campaign/removeProduct/" + partnerId, productId);
}

解决方案只是简单地将此参数(productId)打包到这样的对象中:

$scope.removeProduct = function (partnerId, productId) {
    $scope.productData = {productId: productId};
    $http.post("/campaign/removeProduct/" + partnerId, $scope.productData);
}

但为什么我必须这样做呢?顺便说一句,这是正确的还是应该以不同的方式进行?

@EDIT 还有一件事,我添加/删除任何对象后应该如何刷新数据? 这是对的吗?

$scope.addPartner = function(data) {
$http({method: 'POST', url: addPartner, data})
.then(function(response) {
console.log(response);
});
$scope.loadPartnersData();
window.alert("Partner added!");
};

$scope.loadPartnersData = function () {
$http.get("/campaign/partner-list").then(function(result) {
$scope.partnerList = result.data.partnerList;
});
};

后端:

router.get('/partner-list', function (req, res) {
    Partner.find({}, function (err, partnerList) {
        if (err) throw err;

        res.json({ partnerList: partnerList });
    });
});

2 个答案:

答案 0 :(得分:1)

我假设您希望网址类似于/shop/removeProduct/34523543?productData=5325345。如果是这样,那么我将使用声明$http请求的角度方式:

var url = '/shop/removeProduct/' + partnerId; /* How ever you declare this */
$scope.removeProduct = function() {
  $http({method: 'POST', url, params:{'productData': productId}})
    .then(function(response) {
      console.log(response);
    });
};

$scope.removeProduct();

Angular then takes care of the decoding of the parameters

答案 1 :(得分:1)

如果您发送文字:

,则应将Content-Type标头设置为text/plain
$scope.removeProduct = function (partnerId, productId) {
   var config = { headers: { "Content-Type": "text/plain" }};
   $http.post("/campaign/removeProduct/" + partnerId, productId, config);
}

如果你的节点路由处理程序接受text/plain内容,那么这个shoudl工作。 (如果您正在使用正文解析器,请务必添加app.use(bodyParser.text());

在这种特殊情况下,向资源uri发送DELETE请求似乎更有意义:

$scope.removeProduct = function (partnerId, productId) {
   $http.delete("/campaign/partners/" + partnerId + '/products/' + productId);
}

让你的后端处理这个:

app.get('/campaign/partners/:partner/products/:product', function(req, res){
     myAwesomeDB.remove(req.params.product).then(/*...*/);
});