2016-04-21 18 views
0

Я полностью новичок в node.js и пытаюсь узнать, как это работает. Я знаю, что по умолчанию все вызовы функций node.js являются асинхронными. Теперь мне нужно аутентификацию LDAP в моем приложении, где мне нужно подождать ответа сервера, чтобы проверить правильность или неправильность учетных данных пользователя. Часть ldap работает нормально, но я не уверен, как синхронно возвращать данные из вызова функции , ниже - часть моего кода.node.js вызов синхронной функции для аутентификации

router.js

var express = require('express'); 
var router = express.Router(); 
var tools = require('./authenticateUser'); 

router.post('/authenticateUser', function(req, res) { 
// In the below line i am calling the method which 
// should return the userDN (a string) 
tools.searchUser(req.body.user, req.body.passwd); 

res.render('home.jade'); 

}); 

authenticateUser.js

module.exports = { 
    searchUser : function (username, password) { 
     adminDN = *************; 
     adminPassword = '*********'; 
     baseDN = '***'; 


     var ldap = require('ldapjs'); 
     process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
     var adminClient = ldap.createClient({ 
      url: '*******' 

     }); 
     var opts = { 
      filter: '(&(objectClass=userProxyFull)(sAMAccountName=' + username + '))', 
      scope: 'sub', 
      attribute: ['sAMAccountName'] 

     }; 


     console.log('--- going to try to connect user ---'); 

     try { 
      adminClient.bind(adminDN, adminPassword, function (error) { 
       if (error) { 
        console.log(error.message); 
        adminClient.unbind(function (error) { 
         if (error) { 
          console.log(error.message); 
         } else { 
          console.log('adminClient disconnected'); 
         } 
        }); 
       } else { 

        // Searching Client ID in LDS 

        adminClient.search(baseDN, opts, function (error, search) { 
         console.log('Searching.....' + userDN); 

         search.on('searchEntry', function (entry) { 
          if (entry.object) { 
           // Here i need to return the object back 
           //to the router.js from where i call in a synchronous way 

           adminClient.unbind(function (error) { 
            if (error) { 
             console.log(error.message); 
            } 
           }); 


          } 
         }); 

         search.on('error', function (error) { 
          console.error('error: ' + error.message); 
         }); 


        }); 
       } 
      }); 
     } catch (error) { 
      console.log(error); 
      adminClient.unbind(function (error) { 
       if (error) { 
        console.log(error.message); 
       } else { 
        console.log('client disconnected'); 
       } 
      }); 
     } finally { 
      adminClient.unbind(function (error) { 
       if (error) { 
        console.log(error.message); 
       } else { 
        console.log('client disconnected'); 
       } 
      }); 
     } 

    }, 





}; 

ответ

1

Вы должны пройти res.render ('home.jade') в качестве функции (обратного вызова) в ваша функция поиска.

Это должно выглядеть

tools.searchUser(req.body.user, 
       req.body.password, 
       res} 
) 

функции searchUser

searchUser : function (username, password,res) { 
    ... 
    finally(){ 
     res.render('home.jade'); 
    } 
} 
+0

может пожалуйста разработать немного больше. – Shibankar

+0

@Shibankar Я повторил это, это должно сработать. – QoP

+0

Большое спасибо. это сработало. – Shibankar

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

  • Нет связанных вопросов^_^