Как вернуть значение из метода activedirectory - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть метод в классе, который делает запрос ActiveDirectory.Поэтому я использую пакет 'activedirectory2' npm.Я успешно прошел проверку подлинности и успешно зарегистрировал свой результат в консоли.

Теперь, когда я создал экземпляр своего класса и попытался вызвать метод, я не смог получить непустой результат.

Я попробовал это с getters / setters, чтобы сделать значение _result доступным после усиления класса.Я попытался решить свою проблему с помощью исследования асинхронных вызовов, но, очевидно, не смог задать правильный вопрос.

class Activedirectory

var ActiveDirectory = require("activedirectory2");

class AuthenticateWithLDAP {
   constructor(user, password){
     this._result = [];
     this.user = user;
     this.password = password;
     this.config = {
        url: "ldaps://someldap",
        baseDN: "somebasdn",
        username: this.user,
        password: this.password,
        filter: 'somefilter',
     }
     this.ad = new ActiveDirectory(this.config);
   }
   //Auth Method
   auth() {
     var result = this._result;
     this.config.entryParser = function(entry,raw,callback){
       if(entry.hasOwnProperty('info')) {
        result.push(entry.info);
        this._result = result;
      } 
      callback(entry);
     }
     this.ad.authenticate(config.username, config.password, (err,auth)=>{
      if (err) {
        //some error handling
      }
      if (auth) {
        this.ad.find(config,async (err, userDetails) => {
          var result = this._result;
          {
            if (err) {
              //some error handling
            }
            if(!userDetails) {
              console.log("No users found.");
            } else {
              this._result = result[0]; //I want this result!
              console.log('result: ', this._result); 
              return await this._result;
            }
          }
        })
      } else {
        console.log("Authentication failed!");
      }
    });
   }
//getter/setter
  get result(){
    return this._result;
  }
  set result(value) {
    this._result.push(value);
  }
}
module.exports = AuthenticateWithLDAP;

модуль маршрута

const express = require('express');
const AuthwithLDAP = require('AuthenticateWithLDAP');
const router = express.Router();

router.post('/', async (req,res,next) => {
   let x = async ()=> {
        authwithldap = new AuthwithLDAP(req.body.user,req.body.password);
        return await authwithldap.auth();
    }
    x().then((res)=>{
      console.log('res: ', res); //always []
    })
})

Я ожидал, что смогу использовать значение _result класса AuthenticateWithLDAP в моем обработчике метода router.post.На самом деле я получаю только [] (пустой массив) в router.post.

Не могли бы вы рассказать мне, как изменить значение _result таким образом, чтобы экземпляр класса знал его и мог использовать его снаружи?Сам класс.

Большое спасибо.

Миха

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Не могли бы вы попытаться добавить синтаксис "await" следующим образом?

await x().then((res)=>{
  console.log('res: ', res); //always []
})

Поскольку ваш метод "x" находится в асинхронном режиме, возможно, вам придется подождать, пока обещание не будет разрешено ...

0 голосов
/ 30 апреля 2019

Я не уверен на 100%, но думаю, что это должно сработать. В вашем коде вы не можете вернуть результат, потому что возврат находится в обратном вызове. Есть способы исправить это.

  1. Передать обратный вызов методу auth() (Это плохо, поскольку обратные вызовы отстой)
  2. Вернуть обещание, которое приводит к результату

Я решил пойти на обещания.

var ActiveDirectory = require("activedirectory2");

class AuthenticateWithLDAP {
   constructor(user, password){
     this._result = [];
     this.user = user;
     this.password = password;
     this.config = {
        url: "ldaps://someldap",
        baseDN: "somebasdn",
        username: this.user,
        password: this.password,
        filter: 'somefilter',
     }
     this.ad = new ActiveDirectory(this.config);
   }
   //Auth Method
   auth() {
     return new Promise((resolve, reject) => {
       this.ad.authenticate(config.username, config.password, (err,auth)=>{
         if (err) {
           //Call reject here
         }
         if (auth) {
           this.ad.find(config,async (err, userDetails) => {
             var result = this._result;
             {
               if (err) {
                 //some error handling
               }
               if(!userDetails) {
                 console.log("No users found.");
               } else {
                 this._result = result[0]; //I want this result!
                 resolve(await this._result);
               }
             }
          })
         } else {
           console.log("Authentication failed!");
         }
       });
     });
   }
}
module.exports = AuthenticateWithLDAP;
const express = require('express');
const AuthwithLDAP = require('AuthenticateWithLDAP');
const router = express.Router();

router.post('/', async (req,res,next) => {
   /* This code can be simplifed
    let x = async () => {
        authwithldap = new AuthwithLDAP(req.body.user,req.body.password);
        return await authwithldap.auth();
    }
    x().then((res)=>{
      console.log('res: ', res); //always []
    })
   */
  (async () => {
     authwithldap = new AuthwithLDAP(req.body.user,req.body.password);
     var res = await authwithldap.auth();
     console.log('res: ', res);
  })();
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...