2016-06-27 2 views
1

Я хотел бы сделать запрос POST на моем сервере node.js (используя экспресс) из моего приложения angularjs. У меня возникли проблемы с отправкой правильного ключа {key: value}. Несмотря на часы исследования решения, я не знаю, как правильно писать параметры, чтобы вернуть их на сервер. Мои результаты: '{"key": "value"}': ''. Где я ошибаюсь?angularjs с использованием ng-resource to node.js back-end не отправляет правильный запрос POST

Любая помощь приветствуется, спасибо!

client.js

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); 
    }); 
} 
}]); 

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"}': '' } 

ответ

0

Вы пробовали $ 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 будет либо строка, либо объект.

Примечание: если это строка, убедитесь, что вы используете промежуточное программное обеспечение body-parser на экспресс.

На сервере узла:

var express = require('express') 
    , bodyParser = require('body-parser') 
    app = express(); 

app.use(bodyParser.urlencoded({extended: true}); 

Тело-анализатор промежуточного слоя (помимо всего прочего) занимает полезную нагрузку в req.body и заменяет его действительное представление объекта Java этих данных.

+0

Привет @gavin, спасибо за ваш ответ, он работает, но я хочу использовать $ resource, а не $ http для выполнения запросов тезисов. Есть идея об этом? – Jibeee

+0

Я ответил на вопрос, который, надеюсь, исправит вашу ошибку и предоставит небольшой пример работы $ resource. –

0

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, который позволяет вам

  1. GET Список друзей
  2. GET a single friend
  3. POST сообщение другу (Я предполагаю, что это ваш mes означает?). Когда проводка - message будет доступна в качестве параметра querystring (req.query.message) или в корпусе (req.body.message).

В этом примере оно просто добавляет «сообщение» другу и возвращает объект.

Things отметить (В friendController): Вызов $mes на существующий друга объект возвращает обещание по умолчанию, поэтому нет необходимости в цепи .$promise.

Вызов mes на самом ресурсе не вернуть обещание, поэтому требуется $promise.

+0

Привет @gavin, спасибо за ваше время, очень ценится. К сожалению, у меня все еще есть проблема с req.body: {'{"key": value}': ''} с той модификацией, которую вы мне дали. Странные вещи: я отправил запрос с почтальоном, и он работает правильно, но это не с моим кодом. Поэтому я не думаю, что это проблема node.js. Какую строку кода я должен вам показать? – Jibeee

+0

Нечетные, можете ли вы console.log (req.body) и console.log (req.query) на сервере и посмотреть, что у вас есть? –