2016-05-14 111 views
1

我試圖做一個單一的路由來回mongodb,但它似乎在客戶端,我無法檢索數據從收到的承諾$資源。 在HTML頁面還有誰已經NG-點擊此以下功能的按鈕:Nodejs和快速路由,如何處理客戶端承諾

$scope.getToken = function() { 
    console.log('$scope.getToken()'); 
    authenticationService.getToken($scope.data.email).then(function(result) { 
     $scope.data.token = result; 
    }); 
} 

接收到的結果是:

對象 「M」,與田 - 0: 「J」, 1:「6」,2:「o」,3:「p」,4:「E」,5:「7」,6:「X」,7:「t」,$ promise:d,真的,:對象

正如你可以看到我收到生成的標記,該數據庫似乎做工精細,功能INV也是。

上接收答案的客戶端的服務有一個功能:

function getToken(userEmail) { 
    var deferred = $q.defer(); 
    $resource(baseUrl + '/getToken').save({ 
     email : userEmail 
    }, function(result, error) { 
     if(result) { 
      deferred.resolve(result); 
     } 
     else { 
      deferred.reject(error); 
     } 
    }); 
    return deferred.promise; 
} 

發送此服務器端的功能:

var router = require('express').Router(); 
var authenticator = require('../utils/authUtils'); 
router.post('/getToken', function(request, response) { 
authenticator.getToken(
    function(error, result) { 
     if(error) { 
      //handle error 
     } 
     else if(result) { 
      response.json(result); 
     } 
    } 
); 

而且在authUtils.js:

var mongoUtils = require('./mongoUtils'); 
getToken : function(callback) { 
    var genToken = randToken.generate(8); 
    mongoUtils.query(COLLECTIONS.TOKENS, {'token': { $eq: genToken } }, 
     function(error, result) { 
      if((result && result.length) || error) { 
       //handle error or duplicates 
      } 
      else if(result) { 
       callback(null, genToken); 
      } 
     } 
    ); 
} 

而且在mongoUtils:

query : function(collectionName, query, callback) { 
    _db.collection(collectionName).find(query).toArray(function (error, result) { 
     console.log('Utils.query'); 
     if(error) { 
      //handle error 
     } 
     else { 
      callback(error, result); 
     } 
    }); 
} 

爲什麼服務器端在承諾的對象內發送答案,我應該如何處理?

回答

1

其返回作爲索引對象的理由是因爲 toArray中:

_db.collection(collectionName).find(query).toArray(function... 

一種可能的解決方案將是在一個字符串不使用toArray或發送回結果之前調用slice

response.status(200).json({token: Array.prototype.slice.call(result)}) 

,因爲我可能無法完全理解你的問題另一種可能是嘗試:

authenticationService.getToken($scope.data.email).$promise.then(...) 

如果這是一個ngResource我已經通過$promise訪問then,只是一個想法。

+0

非常感謝!從服務器端返回一個對象返回給客戶端,導致一個字段含有接收到的響應! –

0

所以,你有三個部分在你的問題,爲什麼一個對象,爲什麼承諾和如何處理它。

1:爲什麼在一個物體內部?

根據角官方$資源$resource頁面當您使用$resource返回的資源總是對象,也是在你的API(服務器端)您發送迴響應作爲json object所以你會明顯得到對象。

else if(result) 
{ 
    response.json(result); 
} 

2:爲什麼承諾?

$resource$http都返回一個promise,REST是HTTP的一個子集。這意味着所有可以通過REST完成的事情都可以通過HTTP完成,但並非所有可以通過HTTP完成的事情都可以通過REST完成。這就是$ resource在內部使用$ http的原因。 $資源建立在$ http之上。所以$promise是肯定的。參考Why Promise

3:如何處理呢

我不完全相信你是什麼意思「如何處理它」既然你已經有了對象我會假設你的意思是分開實際生成的令牌數據對象並保留其他所有內容,如果是這種情況,則可以簡單地將結果對象中的數據分配給您的$scope

你正在做的是分配整個對象,$scope它具有所有其他對象

$scope.data.token = result; 

你可以做什麼,生成的令牌被簡單地分配給$scope.data.token 例如:

$scope.data.token = result.genToken; 

希望這會回答這個問題。