Nodejs和express路由,如何处理客户端的承诺

我试图做一个单一的路由来回mongodb,但似乎在客户端,我不能检索数据从$资源收到的承诺。 在HTML页面上有一个button,点击下面的函数:

$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,$ resolved:true, proto :Object

正如你所看到的,我收到了生成的令牌,数据库似乎工作正常,并调用函数。

客户端收到答案的服务有一个function:

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

发送这个的服务器端的function:

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

为什么服务器端在承诺的对象内发送答案,我该如何处理?

它被作为索引对象返回的原因是因为toArray在:

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

一个可能的解决scheme是不要在string上使用toArray或在返回结果之前调用slice

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

另一个可能,因为我可能完全不了解你的问题是尝试:

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

如果它是一个ngResource,我已经通过$promise访问了它,只是一个想法。

所以你有三个部分在你的问题,为什么一个对象,为什么承诺,如何处理它。

1:为什么在一个对象内?

根据Angular官方$ resource page $ resource当你使用$resource的时候,返回的资源总是对象的 ,同样在你的API(服务器端)你发送响应作为一个json object所以你显然会得到对象。

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

2:为什么承诺?

$resource$http都返回一个promise,REST是HTTP的一个子集。 这意味着所有可以通过REST完成的事情都可以通过HTTP完成,但并不是所有可以通过HTTP完成的事情都可以通过REST完成。 这就是$ resource在内部使用$ http的原因。 $资源build立在$ http之上。 所以$promise是肯定的。 供参考为什么承诺

3:如何处理它

我不完全确定你的意思是“如何处理它”,因为你已经拥有了这个对象,我假设你想分离实际生成的令牌数据对象,并保留其他所有的东西,如果情况比你可以简单地分配结果中的数据对象是你的$scope

你正在做的是将整个对象分配给$scope ,其中包含所有其他对象

  $scope.data.token = result; 

你可以做的只是将生成的标记分配给$scope.data.token ,例如:

 $scope.data.token = result.genToken; 

希望这将回答这个问题。