2016-05-14 6 views
1

Ich versuche, eine einzige Routing hin und her zu tun, um zu MongoDB, aber es scheint, dass auf der Client-Seite kann ich die Daten nicht aus dem Versprechen abrufen, die von $ Ressource. Auf der HTML-Seite gibt es eine Taste, die auf diese folgende Funktion hat ng Sie auf:NodeJS und Express-Routing, wie Client-Seite zu behandeln versprechen

$scope.getToken = function() { 
    console.log('$scope.getToken()'); 
    authenticationService.getToken($scope.data.email).then(function(result) { 
     $scope.data.token = result; 
    }); 
} 

Das Ergebnis erhalten ist:

Objekt "m", mit Feldern - 0: "j", 1: "6", 2: "o", 3: "p", 4: "E", 5 "7", 6: "X", 7: "t", $ Versprechen: d, aufgelöst $: wahr, Proto: Object

Wie man sehen kann ich das Token generiert erhalten, scheint die Datenbank in Ordnung und die Funktion inv zu arbeiten oking auch.

Der Service auf der Client-Seite, die die Antwort erhalten hat eine Funktion:

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

Die Funktion auf der Server-Seite, die diese gesendet:

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

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

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

Warum die Server-Seite innerhalb eines Objekts die Antwort sendet zusammen mit dem Versprechen, und wie soll ich damit umgehen?

Antwort

1

Der Grund seiner als indiziertes Objekt zurückgegeben wird, ist wegen toArray in:

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

Eine mögliche Lösung nicht toArray wäre an einer Schnur zu verwenden oder slice aufrufen, bevor das Ergebnis zurückschicken:

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

Eine weitere Möglichkeit, wie ich Ihre Frage nicht verstehen kann, ist völlig versuchen:

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

Wenn es eine ngResource ist habe ich die then über $promise zugegriffen, nur ein Gedanke.

+0

Vielen Dank! das Zurücksenden eines Objekts von der Serverseite zurück zum Client ergab ein Feld mit der empfangenen Antwort! –

0

So haben Sie 3 Teile in Ihren Fragen, warum ein Objekt, warum Versprechen und wie sie damit umgehen.

1: Warum Innerhalb eines Objekts?

Nach Angular offizieller $ Ressourcenseite $resource Wenn Sie $resource Die zurückgegebene Ressource verwenden, ist immer Objekt, auch in Ihrer API (Server-Seite) können Sie die Antwort zurück als json object senden, so werden Sie natürlich Objekt erhalten .

2: Warum versprechen?

$resource und $http beide geben ein Versprechen, REST ist eine Teilmenge von HTTP. Dies bedeutet, dass alles, was über REST möglich ist, über HTTP erfolgen kann, aber nicht alles, was über HTTP möglich ist, kann über REST erfolgen. Aus diesem Grund verwendet $ resource $ http intern. $ resource ist auf $ http aufgebaut. also $promise ist sicher. Referenz Why Promise

3: Wie es behandeln

mir nicht ganz sicher bin, was meinst du mit „Wie es behandeln“, da Sie bereits das Objekt haben würde ich annehmen, dass Sie das trennen gemeint tatsächlich generiertes Token-Datenobjekt und alles andere lassen, wenn das der Fall ist, dann können Sie einfach die Daten innerhalb des Ergebnisobjekts Ihrer $scope zuweisen.

, was Sie tun, ist das gesamte Objekt zu $scope Zuordnung, die alle anderen Objekte hat

$scope.data.token = result; 

, was Sie tun können, ist einfach das generierte Token zum Beispiel zu $scope.data.token zuordnen:

$scope.data.token = result.genToken; 

Hoffe, das wird die Frage beantworten.

Verwandte Themen