Estoy reuniendo un código Node.js para consultar LDAP que usa promesas. Cuando lo ejecuto, aparece una palabra reservada inesperada sobre la espera en la línea 43. Esta parte:
let connection = await connect(ldapURL).catch((err) => { console.error('LDAP server error:', err); reject(err); });El código completo se muestra a continuación.
Tengo una promesa devuelta en la función connect() y funciona bien. De hecho, si elimino la promesa de la función listObjects() , el archivo console.debug console.debug(results); line imprime exactamente lo que estoy esperando.
Entonces, ¿por qué await await connect() está causando un error en mi función listObjects() ? Mi búsqueda ha arrojado muchas respuestas que dicen: "Necesita usar async", pero ya tengo mis listObjects() declarados como async.
¿Dónde me he equivocado?
Código completo:
#!/usr/bin/env node import ldapjs from 'ldapjs'; const ldapURL = [ 'ldap://127.0.0.1:389' ]; const bindDN = 'uid=search,dc=home'; const bindPassword = 'P@ssw0rd'; function connect(serverURL) { return new Promise((resolve, reject) => { const client = ldapjs.createClient({ url: serverURL }); client.on('connect', () => { console.debug('Connected to:', ldapURL); console.debug('Binding as:', bindDN); client.bind(bindDN, bindPassword, (err) => { if (err) { console.debug(err.message); reject('Bind credentials rejected.'); } else { resolve(client); } }); }); client.on('error', (err) => { reject('Unable to connect to ' + serverURL); }); }); } /** * Search LDAP and return objects. * @baseDN {string} Where to start, like 'ou=People,dc=example,dc=com' * @filter {string} Optional LDAP query to limit results, like '(objectClass=posixAccount)' * @returns {promise} ... Eventually. */ async function listObjects(baseDN, filter) { return new Promise((resolve, reject) => { let connection = await connect(ldapURL).catch((err) => { console.error('LDAP server error:', err); reject(err); }); let opts = { filter: filter, scope: 'sub' }; let results = []; connection.search(`${baseDN}`, opts, (err, res) => { res.on('searchEntry', (entry) => { results.push(entry); }); res.on('end', () => { connection.unbind(() => { console.debug(results); resolve(results); }); }); }); }); } let ldapObjects = await listObjects('dc=home', '(objectClass=posixAccount)'); console.log(ldapObjects);Después de sugerencias útiles en los comentarios, la solución fue Mover la línea return new Promise((resolver, rechazó) => { hacia abajo para que solo envuelva la parte connection.search(…) como lo sugiere Bergi
Aquí está el código después de esa modificación:
#!/usr/bin/env node import ldapjs from 'ldapjs'; const ldapURL = [ 'ldap://127.0.0.1:389' ]; const bindDN = 'uid=search,dc=home'; const bindPassword = 'P@ssw0rd'; function connect(serverURL) { return new Promise((resolve, reject) => { const client = ldapjs.createClient({ url: serverURL }); client.on('connect', () => { console.debug('Connected to:', ldapURL); console.debug('Binding as:', bindDN); client.bind(bindDN, bindPassword, (err) => { if (err) { console.debug(err.message); reject('Bind credentials rejected.'); } else { resolve(client); } }); }); client.on('error', (err) => { reject('Unable to connect to ' + serverURL); }); }); } /** * Search LDAP and return objects. * @baseDN {string} Where to start, like 'ou=People,dc=example,dc=com' * @filter {string} Optional LDAP query to limit results, like '(objectClass=posixAccount)' * @returns {promise} ... Eventually. */ async function listObjects(baseDN, filter) { let connection = await connect(ldapURL).catch((err) => { console.error('LDAP server error:', err); reject(err); }); let opts = { filter: filter, scope: 'sub' }; let results = []; return new Promise((resolve, reject) => { connection.search(`${baseDN}`, opts, (err, res) => { res.on('searchEntry', (entry) => { results.push(entry); }); res.on('end', () => { connection.unbind(() => { resolve(results); }); }); }); }); } let ldapObjects = await listObjects('dc=home', '(objectClass=posixAccount)'); console.log(ldapObjects);Creo que debe eliminar la nueva Promesa porque async devuelve los datos envueltos en la Promesa. Creo que su ldapObjects almacena una Promesa y listObjects devuelve una envoltura de Promesa dentro de una Promesa.