簡體   English   中英

Nodejs和快速路由,如何處理客戶端承諾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM