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;
希望这将回答这个问题。