节点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});
- 请求的资源上没有“Access-Control-Allow-Origin”标题。 NodeJS和AngularJS应用程序
- 卫星然后authentication后不叫
- 部署到heroku – 未能检测到buildpack nodejs(jasonswett)
- angular 2 package.json文件的说明
- 集成Angular.js和Node.js(Express + Tower.js)
- 使用NodeJs,ExpressJs注册时validation电子邮件地址
- 使用Angular $资源执行获取请求时出错
- Babel + Typescript + NPM模块+ Webpack
- 使用Grunt和Node.js构buildAngularJS UI-Grid时遇到困难