Бесконечная загрузка моего сайта API NodeJS, если имя пользователя не существует на моем сервере LDAP - PullRequest
0 голосов
/ 28 февраля 2020

я пытаюсь запрограммировать RestfulAPI с NodeJS, ExpressJS и Ldap JS. Я хочу создать страницу профиля пользователя, где пользователь сможет видеть свои атрибуты на сервере LDAP и может их изменять.

Если я введу действительный идентификатор пользователя в URL-адресе запроса, сервер успешно найдет пользователя и ответить на требуемые атрибуты этого пользователя, которые можно увидеть, например, через браузер и почтальона. Теперь моя проблема в том, что если данный «uid», соответственно, сам пользователь не существует на моем LDAP-сервере, сайт продолжает загружаться бесконечно и не выдает никаких ошибок или каких-либо ответов ...

Вот мой текущий код:

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

const ldap = require('ldapjs');
const client = ldap.createClient({
    url: 'ldap://ldap.example.de:389',
    timeout: 30000,
    reconnect: true
});

client.bind('cn=readonly,dc=example,dc=de', 'secret', function(err){
    if(err) throw err;
});

router.get('/:username', function(req, res) {
    let opts = {
        scope: 'sub',
        filter: `(uid=${req.params.username})`,
        // attributes: ['givenName', 'sn', 'jpegPhoto', 'mail', 'uid']
        attributes: ['givenName', 'sn', 'mail', 'uid'] //example attributes (not final)
    }

    client.search('ou=User,dc=example,dc=de', opts, function(err, result) {
        if(err) throw err;

        result.on('searchEntry', function(entry){
            res.send(entry.object);
        });

        result.on('searchReference', function(referral) {
            console.log('referral: ' + referral);
        });

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

        res.on('end', function(result) {
            console.log('status: ' + result.status);
        });
    });
});

Я везде искал решение или возможную проблему, но ничего не смог найти. Итак, я должен спросить вас, ребята ^^ Я надеюсь, что вы можете помочь мне

Обновленный код с помощью Klaycon:

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

const ldap = require('ldapjs');
const client = ldap.createClient({
    url: 'ldap://ldap.example.de:389',
    timeout: 30000,
    reconnect: true
});

client.bind('cn=readonly,dc=example,dc=de', 'secret', function(err){
    if(err) throw err;
});

router.get('/:username', function(req, res) {
    let opts = {
        scope: 'sub',
        filter: `(uid=${req.params.username})`,
        // attributes: ['givenName', 'sn', 'jpegPhoto', 'mail', 'uid']
        attributes: ['givenName', 'sn', 'mail', 'uid'] //example attributes (not final)
    }

    client.search('ou=User,dc=example,dc=de', opts, function(err, result) {
        if(err) throw err;

        result.on('searchEntry', function(entry){
            res.send(entry.object);
        });

        result.on('searchReference', function(referral) {
            console.log('referral: ' + referral);
        });

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

        result.on('end', function(resu) {
            console.log('status: ' + resu.status);
            if(resu.status != 0) res.status(404).send("User not found");
        });
    });
});

1 Ответ

0 голосов
/ 28 февраля 2020

По ldap js документам :

Ответы от метода поиска являются EventEmitter, где вы получите уведомление для каждого searchEntry, который возвращается с сервера. Кроме того, вы сможете прослушивать searchReference, ошибку и конечное событие. Обратите внимание, что событие ошибки будет только для ошибок клиента / TCP, а не для кодов ошибок LDAP, как другие API. Вы можете проверить код состояния LDAP (вероятно, 0) в конечном событии, чтобы подтвердить успешность.

Если поиск не даст результатов, result никогда не выдаст searchEntry, но будет испускать end вместо. Прямо сейчас вы только когда-либо звоните res.send() в случае, если событие searchEntry сработало - но что, если оно никогда не произойдет? Вам нужно будет прослушать событие end и обработать случай, когда результат не был найден, соответственно вернув ответ пользователю. Похоже, вы пытались это сделать, поскольку ваш пример очень похож на пример из документации, но вы по крайней мере забыли изменить res на result.

result.on('end', function(result) {
    console.log('status: ' + result.status);
    if(result.status != 0) res.status(404).send({ message: "User not found" }); //customize as needed
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...