angularjs使用ng资源到node.js后端未发送正确的POST请求

angularjs使用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': '

我想从angularjs应用程序向node.js服务器(使用express)发出POST请求。我无法发送正确的{key:value}。尽管我花了几个小时研究这个解决方案,但我不知道如何正确地编写参数以使它们返回服务器端。我的结果是:'{“键”:“值”}':'。我错在哪里

感谢您的帮助,谢谢

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);
    });
}
}]);
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,允许您

  • 获取朋友列表
  • 找个单身朋友
  • 给朋友发一条消息(我想这就是你的mes代表的意思?)。发布时-
    消息
    将作为查询字符串参数(
    req.query.message
    )或正文(
    req.body.message
    )提供
  • 在本例中,它简单地将“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,允许您

  • 获取朋友列表
  • 找个单身朋友
  • 给朋友发一条消息(我想这就是你的mes代表的意思?)。发布时-
    消息
    将作为查询字符串参数(
    req.query.message
    )或正文(
    req.body.message
    )提供
  • 在本例中,它简单地将“message”附加到朋友并返回