2013-10-25 81 views
1

AngularJS $resource calls the wrong API URL when using method:POST

跟進我的控制器設置這樣的,有角的$resource

$scope.updateProduct = $resource('/api/updateProduct/:product/:param/:value',{},{ 
    query: {method:'GET'}, 
    post: {method:'POST'}, 
    save: {method:'PUT', params: {brand: '@brand', param:'@param', value:'@value'}}, 
    remove: {method:'DELETE'} 
}); 
$scope.updateProduct.save({ 
    product : $scope.post._id, 
    param: 'likes', 
    value: $scope.user._id 
    }); 

我的服務器在NodeJSExpressJS上運行。在我的控制檯,當save操作被調用時,我可以看到:

POST /api/updateBrand/<productid>/likes/fun,%20quirky%20loud,%20boho,%20hippy 200 22ms - 2.31kb 

然而,我的API沒有被正確地訪問。例如,如果我在瀏覽器中轉到上面的URL,就會調用API函數,並更新我的數據庫(並在我的服務器控制檯中報告它)。然而,當Angular在這個URL上做一個PUT時,什麼都沒有發生。

有趣的是,當我將$scope.updateProduct.save()更改爲$scope.updateProduct.get()時,API被正確調用並且一切正常。

任何想法這裏發生了什麼?

編輯:這裏的服務器設置:

ExpressJS API設置:

app.get('/api/updateProduct/:product/:param/:value', api.updateProduct); 

API code

exports.updateProduct = function (req, res) { 
    console.log("TEST") 

    var product = req.params.product; 
    var param = req.params.param; 
    var value = req.params.value; 
    var props = { $push: {} }; 

    if(param == 'userTags'){ 
     var oldVal = value; 
     value = oldVal.match(/[-'"\w]+/g); 
     props.$push[param]; 
     props.$push[param] = {$each: []}; 
     props.$push[param].$each = value; 
    }else{ 
    var props = { $push: {} }; 
     props.$push[param] = value;  
    } 
    db.products.update({"_id": ObjectId(product)}, props, function (err, record) { 
     if (err || !(record)) { 
      console.log("Lookup Error: " + err); 
     } else{ 
      console.log("Updated " + product + " with " + param); 
      console.log(record); 
      res.json({obj:record}) 
     } 
    }); 
}; 
+0

你可以顯示你的服務器的代碼? – jpmorin

+0

我可以但它根本沒有被訪問,第一行是一個'console.log(「TEST」)',它沒有被訪問。再一次,當我做'updateProduct.get()'而不是'updateProduct.save()'它工作得很好(所以'console.log()'正確記錄) – Jascination

+0

我認爲你的服務器路由可能有問題。 – jpmorin

回答

2

看來,您的服務器不等待POST或PUT請求,而是根據您的配置獲取GET請求。

app.get('/api/updateProduct/:product/:param/:value', api.updateProduct); 

根據ExpressJS API(http://expressjs.com/api.html),您應該能夠用任何有效的http動詞替換get。

app.VERB(path, [callback...], callback) 
app.post('/api/updateProduct/:product/:param/:value', api.updateProduct); 
app.put('/api/updateProduct/:product/:param/:value', api.updateProduct); 
+0

是的,測試和工作很好。乾杯! – Jascination

相關問題