【发布时间】:2021-06-28 12:00:25
【问题描述】:
希望你们每个人都做得很好。我遇到了一些问题。任何帮助将不胜感激。
我正在使用 ldapJS,我想从 LDAPJS 的 searchEntry 方法中调用另一个承诺。当我编写与下面相同的代码时。它会引发错误
exports.getADUsers = async (reqst, resp, next) => {
let flag = false;
var finalList = [];
let adConnStatus = await ConnectAD()
.then().catch((errConnStatus) => {
console.log("Error in connection with Active directory " + errConnStatus);
});
if (adConnStatus.status == 0) {
let client = adConnStatus.client;
const opts = {
filter: '(ObjectClass=*)',
scope: 'sub',
attributes: ['cn', 'sid', "objectSid"]
};
client.search('dc=domain,dc=com', opts, (err, res) => {
if (err) {
console.log("Error: " + err);
} else {
res.on('searchEntry', (entry) => {
finalList = await searchEntry(entry);
});
res.on('searchReference', (referral) => {
console.log('referral: ' + referral.uris.join());
});
res.on('error', (err) => {
console.error('error: ' + err.message);
});
res.on('end', (result) => {
resp.send(finalList);
console.log(result);
});
}
});
}
}
错误:
finalList = await searchEntry(entry);
^^^^^
SyntaxError: await is only valid in async function
请帮忙!如何从一个承诺中调用另一个承诺。虽然该方法是异步的,但为什么会显示此消息?我做错了什么?
编辑
按照@Punth 的建议添加关键字async 后。还修改了一些代码。我的新代码如下。
exports.getADUsers = async (reqst, resp, next) => {
let adConnStatus = await ConnectAD()
.then().catch((errConnStatus) => {
console.log("Error in connection with Active directory " + errConnStatus);
});
if (adConnStatus.status == 0) {
var adUsersList = [];
let client = adConnStatus.client;
const opts = {
filter: '(ObjectClass=*)',
scope: 'sub',
attributes: ['cn', 'sid', "objectSid"]
};
client.search('dc=domain,dc=com', opts, (err, res) => {
if (err) {
console.log("Error: " + err);
} else {
res.on('searchEntry', async (entry) => {
var raw = entry.raw;
if (raw.objectSid != "undefined" && raw.objectSid != null && entry.object.cn != null && entry.object.cn != "undefined") {
let userData = {
"Name": entry.object.cn,
"SSID": sidBufferToString(raw.objectSid)
}
var lmn = await ConnectAndGetUsersList(userData.SSID);
userData["XYZ"] = lmn.xyz;
userData["ABC"] = lmn.abc;
adUsersList.push(userData);
}
});
res.on('searchReference', (referral) => {
console.log('referral: ' + referral.uris.join());
});
res.on('error', (err) => {
console.error('error: ' + err.message);
});
res.on('end', (result) => {
console.log(result);
resp.send(adUsersList);
});
}
});
}
}
通过运行上面的代码,它不会向我显示任何内容。 res.on('end' ....) 在res.on("searchEntry"....) 之前被调用,因此adUsersList 的数组为空。
现在我的问题是如何resp.send最终的arraylist???
【问题讨论】:
-
(err, res) => {…}和(entry) => { … }不是async方法 -
您希望从响应流中获得多少
searchEntry事件? -
是的,您的
client.search不是异步方法,因此您不能在内部使用 await。就做searchEntry(entry).then(...) -
@Bergi 搜索条目事件可能从 100 到数百万不等
-
@Bergi 请您帮忙解决这个问题,等待仅在异步方法中有效。哦!等等,让我更新我的问题,我忘了添加搜索条目方法部分
标签: javascript node.js ldapjs