Node.js v16.18.1中activedirectory包findUser方法报错求助
环境与问题概述
Node.js v16.18.1 环境下,使用 activedirectory npm 包完成AD用户身份认证后,调用findUser方法获取用户详情时触发类型错误。
代码示例
async authUserActiveDirectory(usernameAD: string, pass: string) { const config = { url: 'ldap://192.168.136.136', baseDN: 'DC=octopusadlocal,DC=com', username: usernameAD+'@octopusadlocal.com', password: pass, }; const ad = new ActiveDirectory(config); const userName = usernameAD+'@octopusadlocal.com'; ad.authenticate(userName, pass, function(err, auth) { if (err) { console.log('Error authenticating user:', userName); } if (auth) { console.log('Usernames', userName, 'authenticated successfully'); const sAMAccountName = userName; ad.findUser(sAMAccountName, function(err, user) { if (err) { console.log(err) } if(!user) { console.log('no user exists') } else { console.log(user) } }) } else { console.log('User', userName, 'not authenticated'); } }); }
执行输出
使用 activedirectory 包的 ad.findUser 方法时出现以下问题:
Usernames oct1@octopusadlocal.com authenticated successfully
报错信息(已翻译)
/validation/node_modules/activedirectory/lib/activedirectory.js:416
delete result.controls; // 删除SearchEntry返回的controls数组
^
TypeError: 无法将undefined或null转换为对象
在 CorkedEmitter.onSearchEntry (/validation/node_modules/activedirectory/lib/activedirectory.js:416:5)
在 CorkedEmitter.emit (node:events:513:28)
在 CorkedEmitter.emit (/validation/node_modules/ldapjs/lib/corked_emitter.js:44:33)
在 sendResult (/validation/node_modules/ldapjs/lib/client/client.js:1233:22)
在 messageCallback (/validation/node_modules/ldapjs/lib/client/client.js:1253:14)
在 Parser.onMessage (/validation/node_modules/ldapjs/lib/client/client.js:919:14)
在 Parser.emit (node:events:513:28)
在 Parser.write (/validation/node_modules/ldapjs/lib/messages/parser.js:135:8)
在 Socket.onData (/validation/node_modules/ldapjs/lib/client/client.js:875:22)
在 Socket.emit (node:events:513:28)
解决方法
- 修正
findUser参数格式:findUser方法要求传入的sAMAccountName是用户短账号(如oct1),而非完整的用户主体名称(UPN,即oct1@octopusadlocal.com)。原代码传入完整邮箱格式导致AD搜索无结果,进而触发空值错误。修改代码:const sAMAccountName = usernameAD; // 直接使用传入的短账号参数 - 完善错误处理逻辑:原代码中
authenticate回调内,即使认证报错仍会继续执行后续逻辑,可能引发异常扩散。添加终止逻辑:if (err) { console.log('Error authenticating user:', userName); return; // 报错后终止后续代码执行 } - 临时补丁(若无法升级包):该错误属于activedirectory包的bug——当搜索结果为空时,
result为undefined却执行了delete result.controls。若无法升级包,可手动修改node_modules/activedirectory/lib/activedirectory.js第416行:
长期建议升级至最新版本的activedirectory包,或改用修复过此类空值问题的if (result && result.controls) { delete result.controls; }activedirectory2分支。
内容的提问来源于stack exchange,提问作者dave_ag

