2015-09-10 6 views
-1

Я застрял в получении результата возврата от функции для аутентификации пользователя.Как вернуть значение вложенной функции в Nodejs

utility.isAspAuth = function(token){ 
    queryString = { 
     sql: 'SELECT * FROM SecurityToken WHERE Token = ?', 
     timeout: 40000, // 40s 
     values: [token] 
    }; 
    var curTime = new Date(); 
    connection.query(queryString,function(err,rows,field){ 
     if(err){ 
      console.log('error on query' + err); 
     }else{ 

      var result = rows[0]; 

      result.forEach(function(element, index, array){ 
       if(Date.parse(result.Expires) > curTime){ 
        return true; 
       }else{ 
        return false; 
       } 
      }); 
     } 
    }); 
}; 

так я называю эту функцию в другом файле, но результат не определен

console.log(utility.isAspAuth(token)) 

может кто-нибудь дать мне подсказку о том, как это исправить?

Спасибо большое

+0

асинхронный, асинхронном, асинхронный. Функция 'connection.query()' асинхронна. Это означает, что он вызывает обратный вызов когда-то LATER, долго после того, как 'isAspAuth()' уже вернулся. Вы не можете вернуть асинхронное значение из такой функции. Вместо этого вы должны передать обратный вызов в 'isAspAuth()' и вызвать этот обратный вызов, когда у вас есть окончательное значение, и вы можете использовать только значение из этого обратного вызова. Есть сотни дубликатов этого типа вопроса. Я поеду искать, чтобы отметить это. – jfriend00

ответ

1

Издание является:

При вызове utility.isAspAuth(token) из другого файла вашей функции в utility файл становится все выполнить, но ничего не возвращающейся в момент вызова.

Это характер узлов. Обратите внимание, в коде -

connection.query(queryString,function(err,rows,field){

только после того, как запрос выполняется ваша функция обратного вызова в строке выше запускается на выполнение, что привычка»случаться серийно. Это asyn по умолчанию. Вот почему вы получаете nothing т.е. undefined в вашем console.log().

Фикс:

Использование обещает -

https://github.com/kriskowal/q

Если функция не может возвращать значение или выбросить исключение без блокировки, он может вернуть обещание вместо этого. "

В вашей утилите файл -

utility.isAspAuth = function(token){ 

    var deferred = Q.defer(); 
    /* require('q') in your nodejs code. 
     You see at the last line of this function we return a promise object. 
     And in your success/fail function we either resolve/ reject the promise. 
     Simple. See the usage in other file where you log. 
    */ 

    queryString = { 
     sql: 'SELECT * FROM SecurityToken WHERE Token = ?', 
     timeout: 40000, // 40s 
     values: [token] 
    }; 
    var curTime = new Date(); 
    connection.query(queryString,function(err,rows,field){ 
     if(err){ 
      // console.log('error on query' + err); 

      deferred.reject(new Error(err)); 

     } else { 

      var result = rows[0]; 

      result.forEach(function(element, index, array){ 
       if(Date.parse(result.Expires) > curTime){ 

        deferred.resolve(true); 

       }else{ 

        deferred.resolve(false); 
       } 
      }); 
     } 
    }); 


    return deferred.promise; 

}; 

В вашем других file-

utility.isAspAuth(token) 
.then(function (yourBoolResponse) { 

    console.log(yourBoolResponse); 
}) 
.catch(function (err) { 

    // Handle error thrown here.. 
}) 
.done(); 
+0

Пожалуйста, не публикуйте ответы на вопросы, для которых есть много и много дубликатов. Вместо этого просто проголосуйте, чтобы закрыть как дубликат. Это просто загрязняет мир StackOverflow, если есть много дубликатов, которые задают один и тот же вопрос. – jfriend00

+0

@ jfriend00 - Да, теперь это помню. Спасибо btw за указание. – jitendra

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