提问者:小点点

无法用chrome-cookies-secure模块解析Node.js应用程序中的Promise


我正在开发一个本地的Node.js应用程序,它需要访问Google Chrome cookie。我已经找到了chrome-cookies-secure库,它似乎可以完成这项工作,但我就是不知道下面的代码有什么问题。

const chrome = require('chrome-cookies-secure');

const domains = [
    "google.com"
];

const resolveCookies = async () => {
    let result = [];
    for(domain of domains) {
        await chrome.getCookies(`https://${domain}/`,  (err, cookies) => { 
            result.push(cookies); 
            // console.log(cookies); //? This is going to correctly print the results
        })
    }
    return result;
}

const final = resolveCookies();
console.log(final); //! This is going to return a Promise { <pending> } object

我的想法是,我只想把所有域的cookie存储在一个列表中,但不管是什么,我都无法解决这个承诺。我没有看到这个模块的异步调用的任何例子,但是如果我不使用它,它将在脚本执行后返回一个空列表。

我的节点版本:v14.4.0

我做错了什么?


共3个答案

匿名用户

看起来getcookies的实现没有正确地等待异步进程。您可以在实现中看到,尽管getcookies本身是async,但它调用getDerivedKey时并不等待它(而且该函数也不是async)。

与其试图依赖于此实现,我建议使用util.promisify通过回调创建适当的承诺:

const util = require('util');

const chrome = require('chrome-cookies-secure');

const getCookies = util.promisify(chrome.getCookies);

// ...

const cookies = await getCookies(`https://${domain}/`);

手动显示如下:

const getCookies = (url) => new Promise((resolve, reject) => {
    chrome.getCookies(url, (err, cookies) => {
        if (err) {
            reject(err);
        } else {
            resolve(cookies);
        }
    });
});

已经有人试图修复这个问题,但将近九个月没有合并。

请注意,一旦有了要调用的工作函数,您也可以转换:

const resolveCookies = async () => {
    let result = [];
    for(domain of domains) {
        await chrome.getCookies(`https://${domain}/`,  (err, cookies) => { 
            result.push(cookies); 
            // console.log(cookies); //? This is going to correctly print the results
        })
    }
    return result;
}

简单地说:

const resolveCookies = () => Promise.all(domains.map((domain) => getCookies(`https://${domain}/`)));

匿名用户

async函数返回promise。因此,您的resolvecookies函数还将返回一个promise,正如您所注意到的那样。

您需要使用链接console.log。然后,例如。

resolveCookies().then(console.log);

或者,如果您需要将它设置为一个变量,例如final,那么您也需要等待promise。在这种情况下,您需要一个异步生命:

(async () => {
    const final = await resolveCookies();
    console.log(final);
})();

匿名用户

试试这个。

const chrome = require('chrome-cookies-secure');

const domains = [
    "www.google.com"
];

const resolveCookies = async() => {
    let result = [];
    for (domain of domains) {
      const cookies = await getCookies(domain)
      result.push(cookies)
    }
    return Promise.resolve(result);
}

const getCookies = async (domain) => {
    chrome.getCookies(`https://${domain}/`,  (err, cookies) => { 
        return Promise.resolve(cookies);
    })
}

resolveCookies().then((resp) => {
    console.log('FINAL ',resp)
}).catch((e) => {
    console.log('ERROR ', e)
})