我正在开发一个本地的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
我做错了什么?
看起来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)
})