nodejs没有向发起者调用者返回外部api调用

时间:2015-01-07 17:54:06

标签: angularjs node.js express

app结构是angularjs(客户端),nodejs(服务器),服务层(外部api)。调用链是成功的,因为我得到了nodejs层中预期的值,但它从未使它返回到angularjs中的原始调用。我相信我需要从角度传递一个回调函数但我的尝试失败了所以我将提供我开始时的原始代码。

[更新]来自angularjs图层的原始调用。 findCustomers函数绑定到ui-bootstrap指令的typeahead组件:

  $scope.findCustomers = function(chars) {
    var customers = [],
        url = 'api/v1/accounts/' + encodeURIComponent(chars) + '/';

    try
    {
        //return $http.jsonp(url)
        return $http.get(url)
            .then(function(res) {
                if(res.data)
                {
                    customers = angular.fromJson(res.data);
                }

                return customers;
            }, function (error) {
                console.log('Unable to load the customers: ' + JSON.stringify(error))
            });
    }
    catch(e){
        console.log("error searching comapny: " + e);
    }

  }

nodejs route设置来处理呼叫:

  app.use('/api/v1/accounts/:search', stormpath.loginRequired, apiAccounts.findAll);

实际路线。当我检查身体时,我可以看到预期的结果。我累了添加next()并返回有效负载(在许多其他事情中),但没有任何效果。

  var http = require('http');

  var accounts = {
      findAll: function(req, res) {
        var callUrl, customers = [],
        urls = {
            apiBaseUrl: config.baseUrl,
            companyApi: '/api/office/companynames/'
        },
        searchValue = req.params.search;

         //console.log('in api accounts.findAll: ' + searchValue);

        return http.get({
                    host: urls.apiBaseUrl,
                    path: urls.companyApi + searchValue + '/'
               }, function(response) {
               var body = '';
               response.on('data', function(d) {
                  body += d;
               });
               response.on('end', function() {
                  //console.log('... in response.end');
                  customers = body;

                  res.json(customers);

                  //return JSON.stringify(customers);
             });
          });
        }
      };

      module.exports = accounts;

谢谢!

2 个答案:

答案 0 :(得分:2)

您需要将customers附加到范围。您对异步,承诺和同步函数返回值感到困惑。而不是控制器中的return customers;,只需确保$scope.customers已分配给正确的数组,而角度将从那里获取。

答案 1 :(得分:0)

感谢Peter Lyons,我退后一步,用一双新鲜的眼睛走过代码。外部api方面有一些调整有帮助,但这不是罪魁祸首。问题是答复的格式。 typeahead ui-bootstrap组件期望一个对象数组与返回的格式一个字符串。修复:

  customers = angular.fromJson(res.data);