不幸的是,这似乎是底层ldapjs
库中的错误。ENOTFOUND
需要在 中进行处理,但是Socket.on('error')
直到调用之后才设置它,Socket.connect()
因此在发生 DNS 错误时它不可用。
您可以在此处查看代码https://github.com/ldapjs/node-ldapjs/blob/master/lib/client/client.js#L827
if (server && server.secure) {
socket = tls.connect(port, host, self.tlsOptions)
socket.once('secureConnect', onConnect)
} else {
socket = net.connect(port, host)
socket.once('connect', onConnect)
}
socket.once('error', onResult)
要处理 DNS 错误,它需要如下所示
// reference to the socket
let socket;
if (server && server.secure) {
// create TLS socket and connection handler
socket = new tls.TLSSocket(self.tlsOptions);
socket.once('secureConnect', onConnect)
} else {
// create net socket and connection handler
socket = new net.Socket();
socket.once('connect', onConnect)
}
// set up error handler - including DNS
socket.once('error', onResult)
// connect the socket after we have an error handler
socket.connect(port, host)
我还没有测试过,但有可能向您在这里使用的模块添加错误处理程序也可以工作 -
https://github.com/shaozi/ldap-authentication/blob/master/index.js#L8
var client = ldap.createClient(ldapOpts)
client.on('error', (err) = { /* set up before connect */ });
除了提交 PR 来修复底层库之外,我最好的想法是在尝试连接之前使用包装器进行 DNS 查找 - https://nodejs.org/api/dns.html#dns_dns_lookup_hostname_options_callback
const dns = require('dns');
const auth = await new Promise((resolve, reject) => {
dns.lookup('xxx.xxx.corp', (err, address, family) => {
// console.log('address: %j family: IPv%s', address, family));
if (err) {
return reject(err);
}
return resolve(authenticate(options));
}
});