0

希望你们每个人都做得很好。我遇到了一些问题。任何帮助将不胜感激。

我正在使用 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

请帮忙!如何从一个承诺中调用另一个承诺。虽然该方法是异步的,但为什么会显示此消息?我究竟做错了什么?

编辑

async按照建议添加关键字后@Punth。还修改了一些代码。我的新代码如下。

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???

4

1 回答 1

-1

如下更新此行,要使用回调中的语法调用承诺,async/await您需要使其异步

 res.on('searchEntry', async (entry) => {
   finalList = await searchEntry(entry);
 });
于 2021-06-28T12:24:52.280 回答