TL; DR Ваша проблема
вопрос у вас есть в вашем коде, вероятно, следующая строка:
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"}': '' }
.
Пример применения $ Ресурс:
Я создал небольшой пример использования $ ресурса для GET и POST к 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>
./public/script.JS
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;
});
}
}]);
index.js - сервер Node.js хостинг страницу и обнажая простой API
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');
});
Этот пример имеет простой API, который позволяет вам
- GET Список друзей
- GET a single friend
- POST сообщение другу (Я предполагаю, что это ваш mes означает?). Когда проводка -
message
будет доступна в качестве параметра querystring (req.query.message
) или в корпусе (req.body.message
).
В этом примере оно просто добавляет «сообщение» другу и возвращает объект.
Things отметить (В friendController
): Вызов $mes
на существующий друга объект возвращает обещание по умолчанию, поэтому нет необходимости в цепи .$promise
.
Вызов mes
на самом ресурсе не вернуть обещание, поэтому требуется $promise
.
Привет @gavin, спасибо за ваш ответ, он работает, но я хочу использовать $ resource, а не $ http для выполнения запросов тезисов. Есть идея об этом? – Jibeee
Я ответил на вопрос, который, надеюсь, исправит вашу ошибку и предоставит небольшой пример работы $ resource. –