[英]Nodejs and express routing, how to handle client side promises
我正在嘗試對 mongodb 進行一次來回路由,但似乎在客戶端我無法從 $resource 收到的承諾中檢索數據。 在 HTML 頁面上有一個按鈕,可以通過 ng-click 執行以下功能:
$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 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);
}
});
}
為什么服務器端將答案與承諾一起發送到對象內,我應該如何處理它?
它作為索引對象返回的原因是因為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
,只是一個想法。
所以你的問題有 3 個部分,為什么是一個對象,為什么要承諾以及如何處理它。
1:為什么在對象內部?
根據 Angular 官方 $resource 頁面$resource當您使用$resource
,返回的資源始終是object ,同樣在您的 API(服務器端)中,您將響應作為json object
發送回來,因此您顯然會得到對象。
else if(result)
{
response.json(result);
}
2:為什么要承諾?
$resource
和$http
都返回一個 promise,REST 是 HTTP 的一個子集。 這意味着可以通過 REST 完成的所有事情都可以通過 HTTP 完成,但並非所有可以通過 HTTP 完成的事情都可以通過 REST 完成。 這就是 $resource 在內部使用 $http 的原因。 $resource 建立在 $http 之上。 所以$promise
是肯定的。 供參考為什么 Promise
3:如何處理
我不確定“如何處理它”是什么意思,因為您已經有了對象,我假設您打算將實際生成的令牌數據對象分開並保留其他所有內容,如果是這種情況,您可以簡單地分配結果對象中的數據是您的$scope
。
您正在做的是將整個對象分配給具有所有其他對象的$scope
$scope.data.token = result;
您可以做的只是將生成的令牌分配給$scope.data.token
例如:
$scope.data.token = result.genToken;
希望這能回答這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.