节点js从angular度PUT调用收到错误的数据

我正在实现一个angular度的rest-crud客户端发送数据到一个节点api(我也正在实施)

当我尝试使用ngResource从form-> angular将数据发送到节点api时,就像这样

cmsApp.factory('Misc', ['$resource', function($resource) { return $resource('/api/misc/:id', {}, { 'update': { method:'PUT' } // the $resource obj comes with save/query/get/delete but lacks the update-put method }); }]); 

所以我得到一个错误

  Error: invalid json 

现在,我在这篇(旧)文章后面find了一个解决方法

  cmsApp.config(function ($httpProvider) { $httpProvider.defaults.transformRequest = function (data) { var str = []; for (var p in data) { data[p] !== undefined && str.push(encodeURIComponent(p) + '=' + encodeURIComponent(data[p])); } return str.join('&'); }; $httpProvider.defaults.headers.put['Content-Type'] = $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; }); 

这个窍门有点作品,但打破了数组中的所有string,所以例如,如果我有一个string

  "foo bar" 

我在另一边得到的是

  { '0': 'f', '1': 'o', '2': 'o', '3': ' ', '4': 'b', '5': 'a', '6': 'r' } 

这显然是不可用的数据。

我想知道做这个工作的正确方法,或者如果有任何其他正确的模式,做出这个权利。

附录A

nodejs接收器代码

  router.route('/misc/:misctype') .put(function(req, res) { console.log(req.body.text_label); }); 

你为什么不把你的数据作为一个JSON发送? 你正在实现自己的两端,并在两个使用JavaScript。 JSON是这个用例的理想select。 例如在angular度上,你会做类似的事情:

 // in some template (template.tpl.html) <form> field <input name="name" ng-model="someObject.field"></input> other field <input name="email" ng-model="someObject.otherField"></input> <button ng-click="sendData">Submit</button> </form> //in the controller (myController.js) $scope.someObject = {}; $scope.sendData = function () { doSomeValidation(); $http.put('http://www.myservice.com/api/whatever', someObject) .success(function(result){ console.log('it worked!'); }); } 

$ http service知道默认情况下编码为JSON,而ng-model允许你轻松绑定到表单元素,所以没有理由把表单库带入其中。 然后在节点后端,只需要JSON.parse(request.body)或者如果使用Express,则可以使用中间件来完成。

对于有关$ http对象的信息,您可以在这里查看关于该主题的angular度文档

尝试使用不同的内容types

 "application/json;charset=utf-8" 

事实certificate,这个问题与我可以避免所有的混乱有关

 cmsApp.config(function ($httpProvider) { ..... } 

部分,只是把我发送的对象设置为json,因为,首先我有这个

 Misc.update({ id:'text_descr_assoc' }, $scope.description); 

并通过在json obj中转换,并删除现在无用的cmsApp.config部分,一切工作得很好

 Misc.update({ id:'text_descr_assoc' }, {"my_key":$scope.description});