我试图在mongodb之间来回做一次路由,但似乎在客户端我无法从$ resource收到的承诺中检索数据。 在HTML页面上有一个按钮,点击以下功能:
$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& #34;,$ promise:d,$ resolved:true, proto :Object
正如您所看到的,我收到生成的令牌,数据库似乎工作正常并且函数也在调用。
接收答案的客户端服务具有以下功能:
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);
}
});
}
为什么服务器端在对象内部发送答案以及promise,我该如何处理它?</ p>
答案 0 :(得分:1)
它作为索引对象返回的原因是因为
toArray
in:
_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我通过then
访问了$promise
,只是想一想。
答案 1 :(得分:0)
所以你的问题有3部分,为什么是对象,为什么要承诺以及如何处理它。
1:为什么在对象内?
根据Angular官方$资源页面$resource当您使用$resource
时返回的资源始终是对象,同样在您的API(服务器端)中您正在发送作为json object
回复,所以你显然会得到对象。
else if(result)
{
response.json(result);
}
2:为什么要承诺?
$resource
和$http
都返回一个promise,REST是HTTP的一个子集。这意味着可以通过REST完成的所有工作都可以通过HTTP完成,但并非所有可以通过HTTP完成的工作都可以通过REST完成。这就是$ resource在内部使用$ http的原因。 $ resource建立在$ http之上。所以$promise
是肯定的。供参考Why Promise
3:如何处理
我不确定你是什么意思&#34;如何处理它&#34;因为你已经拥有了这个对象我会假设你想要分离实际生成的令牌数据对象并保留其他所有内容,如果是这样的话,你可以简单地在结果对象中分配你的$scope
您正在做的是将整个对象分配给具有所有其他对象的$scope
$scope.data.token = result;
您可以做的只是将生成的令牌分配给$scope.data.token
例如:
$scope.data.token = result.genToken;
希望这会回答这个问题。