簡體   English   中英

為什么即使我的函數被聲明為異步,也會出現意外的保留字“等待”?

[英]Why Unexpected reserved word 'await' even when my function is declared as async?

我正在整理一些 Node.js 代碼,用於查詢使用 Promise 的 LDAP。 當我運行它時,我在第 43 行得到了關於 await 的Unexpected reserved word 。這部分:

let connection = await connect(ldapURL).catch((err) => {
  console.error('LDAP server error:', err);
  reject(err);
});

整個代碼如下所示。

我在connect()函數中返回了一個承諾,並且工作正常。 事實上,如果我從listObjects()函數中刪除承諾, console.debug(results); 行打印出我所期望的。

那么為什么await connect()會導致我的listObjects()函數出錯? 我的搜索得到了很多答案,說“你需要使用異步”,但我已經將我的listObjects()聲明為異步。

我哪里出錯了?

完整代碼:

#!/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);

在評論中提出有用的建議后,解決方案是將 line return new Promise((resolve, reject) => { 向下移動,以便它只按照 Bergi 的建議包裝 connection.search(...) 部分

這是修改后的代碼:

#!/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);

我認為您必須刪除新的 Promise,因為異步返回的數據包含在 Promise 中。 我認為您的 ldapObjects 存儲了一個 Promise,而 listObjects 在 Promise 中返回了一個 Promise 包裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM