2016-04-21 3 views
0

Ich bin komplett neu in node.js, und versuchen zu lernen, wie es tatsächlich funktioniert. Ich weiß, dass standardmäßig alle Funktionsaufrufe von node.js asynchron sind. Jetzt brauche ich LDAP-Authentifizierung in meiner Anwendung, wo ich auf die Serverantwort warten muss, um zu überprüfen, ob die Benutzeranmeldeinformationen richtig oder falsch sind. Der ldap-Teil funktioniert gut, aber ich bin nicht sicher, wie Sie Daten von einem Funktionsaufruf auf synchrone Weise zurückgeben . unten ist der Teil meines Codes.node.js synchroner Funktionsaufruf zur Authentifizierung

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

    }, 





}; 

Antwort

1

Sie haben res.render ('home.jade') als eine Funktion übergeben (der Rückruf) zu Ihre searchUser-Funktion.

Es sollte

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

searchUser Funktion aussehen

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

können Sie etwas mehr erarbeiten. – Shibankar

+0

@Shibankar Ich habe es getan, das sollte funktionieren. – QoP

+0

Vielen Dank. es funktionierte. – Shibankar

Verwandte Themen