[英]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.