0

我试图用 NodeJS、ExpressJS 和 LdapJS 编写一个 RestfulAPI。我想做一个用户配置文件页面,用户能够在 LDAP 服务器上看到他的属性并可以更改它们。

如果我在请求 URL 中输入有效的 uid,服务器会成功找到用户并响应该用户的所需属性,例如可以通过浏览器和邮递员看到。我现在的问题是,如果给定的“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");
        });
    });
});
4

1 回答 1

0

根据ldapjs 文档

来自 search 方法的响应是一个 EventEmitter,您将在其中收到从服务器返回的每个 searchEntry 的通知。您还可以侦听 searchReference、错误和结束事件。请注意,错误事件仅针对客户端/TCP 错误,而不是像其他 API 那样的 LDAP 错误代码。您需要检查结束事件的 LDAP 状态代码(可能为 0)以断言成功。

如果搜索没有返回结果,result则永远不会发出searchEntry,而是会发出end。现在你只在事件被触发的情况下调用——但如果它从来没有被触发呢您需要监听事件并处理未找到结果的情况,并相应地向用户返回响应。看起来您尝试这样做,因为您的示例与文档中的示例非常相似,但您至少忘记更改为.res.send()searchEntryendresresult

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
});
于 2020-02-28T17:21:25.620 回答