node.js同步函数调用身份验证

时间:2016-04-21 18:43:46

标签: node.js ldapjs

我在node.js中完全是新手,并尝试了解它是如何工作的。我知道默认情况下所有node.js函数调用都是异步的。现在我需要在我的应用程序中进行LDAP身份验证,我需要等待服务器响应来检查用户凭据是对还是错.ldap部分工作正常,但我不确定如何以同步方式从函数调用返回数据。下面是我的代码的一部分。

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 个答案:

答案 0 :(得分:1)

你必须将res.render(' home.jade')作为函数(回调)传递给searchUser函数。

应该看起来像

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

searchUser函数

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