angularjs使用ng资源到node.js后端未发送正确的POST请求
我想从angularjs应用程序向node.js服务器(使用express)发出POST请求。我无法发送正确的{key:value}。尽管我花了几个小时研究这个解决方案,但我不知道如何正确地编写参数以使它们返回服务器端。我的结果是:'{“键”:“值”}':'。我错在哪里 感谢您的帮助,谢谢 client.jsangularjs使用ng资源到node.js后端未发送正确的POST请求,angularjs,node.js,express,ngresource,Angularjs,Node.js,Express,Ngresource,我想从angularjs应用程序向node.js服务器(使用express)发出POST请求。我无法发送正确的{key:value}。尽管我花了几个小时研究这个解决方案,但我不知道如何正确地编写参数以使它们返回服务器端。我的结果是:'{“键”:“值”}':'。我错在哪里 感谢您的帮助,谢谢 client.js module.factory("Friends", function($resource) { return $resource("https://myUrl/:id", {'id': '
module.factory("Friends", function($resource) {
return $resource("https://myUrl/:id", {'id': '@id'} ,{
mes: {method: 'POST', headers: {'content-Type': 'application/x-www-form-urlencoded'} , isArray : false }
});
});
module.controller('communityCtrl', ['$scope','$rootScope', 'Friends', function($scope,$rootScope, Friends) {
var value = "aValue";
$scope.getData = function()
{
Friends.mes({id: 'jb'}, {key : 'value'} ).$promise.then(function(data){
console.log(data);
});
}
}]);
angular.module('app', ['ngResource'])
.factory('friendFactory', ['$resource', function ($resource) {
return $resource(
'/api/v1/friends/:id',
{id: '@_id'},
{
mes: {
method: 'POST',
headers: {'content-Type': 'application/x-www-form-urlencoded'},
isArray : false,
params: { message: true }
}
}
);
}])
.controller('friendController', ['friendFactory', function (friendFactory) {
var vm = this;
vm.friend = null;
vm.getFriend = _getFriend;
vm.messageFriend = _messageFriend;
function _getFriend() {
friendFactory.get({id: 1})
.$promise
.then(function (res) {
console.log(res);
vm.friend = res;
});
}
function _messageFriend(friend) {
/* method 1: call $mes on a friend object: */
// vm.friend.$mes({message: 'A message'})
// .then(function (friend) {
// vm.friend = friend;
// });
/* method 2: call mes on the resource: */
friendFactory.mes({_id: 1, message: 'A message'})
.$promise
.then(function (friend) {
vm.friend = friend;
});
}
}]);
server.js
app.post('myUrl/jb', function(req, res) {
console.log("req.body : ", req.body);
res.json({code: 0, message: req.body.msg || ""});
});
req.body : { '{"key":"value"}': '' }
输出
app.post('myUrl/jb', function(req, res) {
console.log("req.body : ", req.body);
res.json({code: 0, message: req.body.msg || ""});
});
req.body : { '{"key":"value"}': '' }
你试过$http吗
工厂定义:
module
.factory('friendsFactory', ['$http', function ($http) {
return {
post: function (id, data) {
return $http.post('https://myUrl/' + id, data);
},
get: function () {
return $http.get('https://myUrl/');
}
};
}]);
从控制器内部:
module
.controller('friendsController', ['friendsFactory', function (friendsFactory) {
friendsFactory.post(1, {id: 1})
.then(function (res) {
// success
console.log(res.data);
})
.catch(function (err) {
// there has been an error
console.error(err.data);
});
}]);
在node.js API端点中,req.body将是字符串或对象
注意:如果是字符串,请确保您正在express上使用主体解析器中间件
在节点服务器上:
var express = require('express')
, bodyParser = require('body-parser')
app = express();
app.use(bodyParser.urlencoded({extended: true});
正文解析器中间件(除其他外)接受req.body中的有效负载,并将其替换为该数据的有效java对象表示形式。您尝试过$http吗
工厂定义:
module
.factory('friendsFactory', ['$http', function ($http) {
return {
post: function (id, data) {
return $http.post('https://myUrl/' + id, data);
},
get: function () {
return $http.get('https://myUrl/');
}
};
}]);
从控制器内部:
module
.controller('friendsController', ['friendsFactory', function (friendsFactory) {
friendsFactory.post(1, {id: 1})
.then(function (res) {
// success
console.log(res.data);
})
.catch(function (err) {
// there has been an error
console.error(err.data);
});
}]);
在node.js API端点中,req.body将是字符串或对象
注意:如果是字符串,请确保您正在express上使用主体解析器中间件
在节点服务器上:
var express = require('express')
, bodyParser = require('body-parser')
app = express();
app.use(bodyParser.urlencoded({extended: true});
body解析器中间件(除其他外)接受req.body中的有效负载,并将其替换为该数据的有效java对象表示形式;诊断您的问题 代码中存在的问题可能如下所示:
Friends.mes({id: 'jb'}, {key : 'value'} ).$promise.then(function(data){
尝试将其更改为:
Friends.mes({id: 'jb', key: 'value'}).$promise.then(function(data){
完成此操作后,服务器路由上的req.body对象将包含以下{id:'jb',key:'value'}
而不是{{key:“value”}:''}
示例$resource应用程序:
我创建了一个使用$resource获取并发布到API的小示例
/public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular-resource.min.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="app" ng-controller="friendController as vm">
<div>
{{vm.friend}}
</div>
<button ng-click="vm.getFriend()">Get User</button>
<button ng-show="vm.friend" ng-click="vm.messageFriend(vm.friend)">Message Friend</button>
</body>
</html>
index.js-承载页面并公开简单api的node.js服务器
var express = require('express')
, path = require('path')
, app = express()
, bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));
app.use(express.static(path.join(__dirname, './public')));
var friends = [
{ _id: 0, name: 'A' },
{ _id: 1, name: 'B' },
{ _id: 2, name: 'C' },
{ _id: 3, name: 'D' }
];
app.get('/api/v1/friends', function (req, res) {
return res.send(friends);
});
app.get('/api/v1/friends/:id', function (req, res) {
for (var i = 0; i < friends.length; i++) {
if (friends[i]._id == req.params.id) return res.send(friends[i]);
}
return res.status(404).send('Not found');
});
app.post('/api/v1/friends/:id', function (req, res) {
for (var i = 0; i < friends.length; i++) {
if (friends[i]._id == req.params.id) {
friends[i].message = req.query.message;
return res.send(friends[i]);
}
}
return res.status(404).send('Not found');
});
app.listen(8080, function () {
console.log('Server running');
});
var express=require('express'))
,path=require('path'))
,app=express()
,bodyParser=require('body-parser');
use(bodyParser.urlencoded({extended:true,limit:'50mb'}));
app.use(express.static(path.join(uu dirname,'./public'));
var friends=[
{u id:0,名称:'A'},
{{u id:1,名称:'B'},
{{u id:2,名称:'C'},
{{u id:3,名称:'D'}
];
app.get('/api/v1/friends',函数(req,res){
返回res.send(朋友);
});
app.get('/api/v1/friends/:id',函数(req,res){
for(var i=0;i
此示例有一个简单的API,允许您
消息
将作为查询字符串参数(req.query.message
)或正文(req.body.message
)提供friendController
中):
在现有的朋友对象上调用$mes
,默认情况下会返回一个承诺,因此无需链接$promise
对资源本身调用
mes
不会返回承诺,因此需要$promise
。TL;诊断您的问题
代码中存在的问题可能如下所示:
Friends.mes({id: 'jb'}, {key : 'value'} ).$promise.then(function(data){
尝试将其更改为:
Friends.mes({id: 'jb', key: 'value'}).$promise.then(function(data){
完成此操作后,服务器路由上的req.body对象将包含以下{id:'jb',key:'value'}
而不是{{key:“value”}:''}
示例$resource应用程序:
我创建了一个使用$resource获取并发布到API的小示例
/public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular-resource.min.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="app" ng-controller="friendController as vm">
<div>
{{vm.friend}}
</div>
<button ng-click="vm.getFriend()">Get User</button>
<button ng-show="vm.friend" ng-click="vm.messageFriend(vm.friend)">Message Friend</button>
</body>
</html>
index.js-承载页面并公开简单api的node.js服务器
var express = require('express')
, path = require('path')
, app = express()
, bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));
app.use(express.static(path.join(__dirname, './public')));
var friends = [
{ _id: 0, name: 'A' },
{ _id: 1, name: 'B' },
{ _id: 2, name: 'C' },
{ _id: 3, name: 'D' }
];
app.get('/api/v1/friends', function (req, res) {
return res.send(friends);
});
app.get('/api/v1/friends/:id', function (req, res) {
for (var i = 0; i < friends.length; i++) {
if (friends[i]._id == req.params.id) return res.send(friends[i]);
}
return res.status(404).send('Not found');
});
app.post('/api/v1/friends/:id', function (req, res) {
for (var i = 0; i < friends.length; i++) {
if (friends[i]._id == req.params.id) {
friends[i].message = req.query.message;
return res.send(friends[i]);
}
}
return res.status(404).send('Not found');
});
app.listen(8080, function () {
console.log('Server running');
});
var express=require('express'))
,path=require('path'))
,app=express()
,bodyParser=require('body-parser');
use(bodyParser.urlencoded({extended:true,limit:'50mb'}));
app.use(express.static(path.join(uu dirname,'./public'));
var friends=[
{u id:0,名称:'A'},
{{u id:1,名称:'B'},
{{u id:2,名称:'C'},
{{u id:3,名称:'D'}
];
app.get('/api/v1/friends',函数(req,res){
返回res.send(朋友);
});
app.get('/api/v1/friends/:id',函数(req,res){
for(var i=0;i
此示例有一个简单的API,允许您
消息
将作为查询字符串参数(req.query.message
)或正文(req.body.message
)提供