Node.js中使用Axios连接LDAP服务器报错ECONNRESET如何解决?
问题核心原因
Axios是仅支持HTTP/HTTPS协议的请求客户端,没有实现LDAP协议的交互逻辑,无法识别ldap://前缀的请求地址。你向LDAP服务端口发送的是HTTP格式的请求,LDAP服务无法解析,直接主动断开连接,因此抛出Error: read ECONNRESET错误。
你尝试调整GET/POST请求方法、params参数都无法生效的原因也在于此:GET/POST是HTTP协议定义的请求方法,LDAP协议有独立的bind、search等操作指令,和HTTP体系完全不兼容。你用curl能正常请求,是因为curl内置了多协议支持,会自动根据url前缀选择LDAP协议进行交互,和Axios的逻辑完全不同。
解决方案
你想要Promise风格的调用方式,不需要强行适配Axios,直接对已有的ldapjs进行Promise封装即可,封装后同样支持async/await调用,示例代码如下:
const ldap = require('ldapjs'); // 封装LDAP搜索为Promise形式 function ldapSearch(options) { return new Promise((resolve, reject) => { // 初始化LDAP客户端 const client = ldap.createClient({ url: `ldap://${options.ip}:${options.port}` }); // 账号绑定认证 client.bind(options.username, options.password, (err) => { if (err) { client.destroy(); return reject(err); } // 搜索参数配置 const searchOpts = { filter: `(mail=${options.mail})`, scope: 'sub', attributes: ['memberuid', 'name', 'mail', 'objectCategory', 'telephoneNumber'] }; // 发起搜索请求 client.search(`DC=${options.org},DC=${options.int}`, searchOpts, (err, res) => { if (err) { client.destroy(); return reject(err); } const entries = []; // 收集搜索结果 res.on('searchEntry', (entry) => { entries.push(entry.object); }); // 处理搜索错误 res.on('error', (err) => { client.destroy(); reject(err); }); // 搜索结束返回结果 res.on('end', () => { client.unbind(); client.destroy(); resolve(entries); }); }); }); }); } // 调用示例 async function getUser() { try { const users = await ldapSearch({ ip: '你的LDAP服务IP', port: 389, org: '组织名', int: '域名后缀', mail: '要搜索的目标邮箱', username: '绑定账号DN', password: '绑定账号密码' }); console.log('查询结果 =>', users); } catch (error) { console.error('查询失败 =>', error); } } getUser();
如果你不想自行封装,也可以直接使用npm仓库中已经封装完成的Promise版LDAP库,直接导入即可使用async/await风格的API。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

