2015-06-18 81 views
-1

我上應用,在那裏我使用Hapijs /的NodeJS與AngularJS爲什麼要返回未定義?

在這裏工作是的NodeJS部分

server.route({ 
    method: 'POST', 
    path: '/login', 
    handler: function(request, reply) { 
    USER: request.payload.user, 
    PWD: request.payload.password, 
    PLANTA: request.payload.planta, 
    PLANGROUP: request.payload.plantgroup, 
    START_DATE: request.payload.startDate 
    } 
}); 

現在角部位

.factory('LoginService', function($http, $q) { 

    var defer = $q.defer(); 

    return { 
     login: function() { 
     $http.post('http://localhost:8000/login', { 
      user: 'USRCP_HW', 
      password: 'usrcp2012', 
      planta: '6000', 
      plantroup: 'E10', 
      startDate: '2014-11-26' 
     }).success(function(data) { 
      console.log(data); 
      return data; 
     }).error(function(data, status){ 
      console.log(data, status); 
      defer.reject(data); 
     }); 
     return defer.promise; 
     } 
    } 

    }); 

和登錄控制器

.controller('LoginCtrl', function($rootScope, $scope, $stateParams, LoginService) { 

    $scope.login = function(data) { 
     console.log(data); 
    }; 

    }); 

所有我需要的是日誌中的數據,但我GE未定義。

,並在控制器我做

$scope.login = function(data) { 
    console.log(data); 
    LoginService.login(data).then(function() { 
    console.log(data); 
    }) 
}; 

我得到這個在瀏覽器控制檯

OPTIONS http://localhost:8000/login

XMLHttpRequest cannot load http://localhost:8000/login . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://127.0.0.1:8000 ' is therefore not allowed access. The response had HTTP status code 501.

+1

同時匹配的URL的建議,他們應該是本地主機:8000或127.0.0.1:8000 – Chandermani

+1

避免[遞延反模式](http://stackoverflow.com/q/23803743/1048572)! – Bergi

回答

1

這個錯誤是因爲相同的起源政策約束的,我想你可以使用相對路徑爲登錄網址。

不能從這樣的

.factory('LoginService', function ($http, $q) { 

    var defer = $q.defer(); 

    return { 
     login: function() { 
      $http.post('/login', { 
       user: 'USRCP_HW', 
       password: 'usrcp2012', 
       planta: '6000', 
       plantroup: 'E10', 
       startDate: '2014-11-26' 
      }).success(function (data) { 
       console.log(data); 
       defer.resolve(data); //resolve the promise 
       //you can't return from here as it is executed asynchronosly 
      }).error(function (data, status) { 
       console.log(data, status); 
       defer.reject(data); 
      }); 
      return defer.promise; 
     } 
    } 

}); 

異步方法返回然後

.controller('LoginCtrl', function ($rootScope, $scope, $stateParams, LoginService) { 

    $scope.login = function (data) { 
     console.log(data); 
    }; 

    LoginService.login().then($scope.login) 

}); 

也沒有必要創建一個自定義承諾爲$ HTTP也返回一個

.factory('LoginService', function ($http, $q) { 

    return { 
     login: function() { 
      return $http.post('http://localhost:8000/login', { 
       user: 'USRCP_HW', 
       password: 'usrcp2012', 
       planta: '6000', 
       plantroup: 'E10', 
       startDate: '2014-11-26' 
      }).success(function (data) { 
       console.log(data); 
       //you can't return from here as it is executed asynchronosly 
      }).error(function (data, status) { 
       console.log(data, status); 
      }); 
     } 
    } 

}); 

然後

.controller('LoginCtrl', function ($rootScope, $scope, $stateParams, LoginService) { 

    $scope.login = function (data) { 
     console.log(data); 
    }; 

    LoginService.login().success($scope.login) 

}); 
+0

我得到這個:'''類型錯誤:LoginService.login(...)的成功不是一個function''' – NietzscheProgrammer

+0

@NietzscheProgrammer嘗試更新 –

+0

@ArunPJohny - 如果不從.error拋出異常。處理程序 - 如果登錄拋出一個錯誤 - 你將無法處理錯誤,在未來.error處理 - 你鬆散chainability。該'data'也應該從成功處理程序正確返回?否則,它不會在$ scope.login功能結束 – sirrocco

0

http://localhost:8000/login代替如果運行此腳本的站點也位於http://localhost:8000上,則可以使用/ ith/login。

否則,您必須對您的NodeJS服務器上添加跨域策略:

app.all('*', function(req, res, next) { 
     res.header("Access-Control-Allow-Origin", "*"); 
     next(); 
}); 

P.S:這些指令允許根據您的Web服務器的味道CORS可能會有所不同。

1

去回到你原來的CORS問題......在哈皮可以通過路線的基礎上或在全球範圍內的路線上進行配置。

var server = new Hapi.Server(); 

server.connection({ 
    port: process.env.PORT || 3333, 
    routes: { 
     cors: true 
    } 
}); 

你可以在這裏找到更多的信息:http://hapijs.com/api#route-options

另外,您可以同時服務客戶端和來自同一個域的API由Karanvir康