2016-05-14 4 views
1

Я пытаюсь выполнить одну маршрутизацию взад и вперед по mongodb, но, похоже, на стороне клиента я не могу извлечь данные из обещания, полученного от $ ресурсов. На странице HTML есть кнопка, который нг нажмите на эту следующую функцию:Nodejs и экспресс-маршрутизация, как обрабатывать обещания на стороне клиента

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

В результате получили:

объект «м», с полями - 0: «J», 1: «6», 2: «o», 3: «p», 4: «E», 5: «7», 6: «X», 7: «t», $ prom: d, $ resolved: правда, прото: 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); 
     } 
    }); 
} 

Почему серверная сторона отправляет ответ внутри объекта вместе с обещанием и как его обрабатывать?

ответ

1

Причина его возвращается как индексированный объект из-за 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, я обратился к then через $promise, просто подумав.

+0

Большое вам спасибо! отправка объекта обратно с серверной части обратно клиенту привела поле с принятым ответом! –

0

Итак, у вас есть 3 части в ваших вопросах, почему объект, почему обещают и как с ним справиться.

1: Почему внутри объекта?

Согласно угловой официальной странице $ ресурсов $resource При использовании $resource Возвращаемый ресурс всегда объект, а также в вашем API (со стороны сервера) вы отправляете ответ обратно как json object, так что вы, очевидно, получить объект ,

else if(result) 
{ 
    response.json(result); 
} 

2: Почему обещание?

$resource и $http оба возвращают обещание, REST - это подмножество HTTP. Это означает, что все, что можно сделать с помощью REST, можно выполнить через HTTP, но не все, что можно сделать через HTTP, можно выполнить с помощью REST. Вот почему $ resource использует внутренне $ http. $ resource построен поверх $ http. так что $promise - это точно. для справки Why Promise

3: Как обрабатывать его

Я не совсем уверен, что вы подразумеваете под «Как справиться с этим», так как у вас уже есть объект, я предполагаю, вы имели в виду, чтобы отделить фактический созданный объект данных токена и оставить все остальное, если это так, вы можете просто назначить данные в объекте результата своим $scope.

то, что вы делаете, назначая весь объект $scope, который имеет все другие объекты

$scope.data.token = result; 

, что вы можете сделать, это просто присвоить сгенерированный маркер $scope.data.token , например:

$scope.data.token = result.genToken; 

Надеюсь, это ответит на вопрос.

Смежные вопросы