Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法使用chrome cookies安全模块解析Node.js应用程序中的承诺_Javascript_Node.js_Asynchronous_Cookies_Promise - Fatal编程技术网

Javascript 无法使用chrome cookies安全模块解析Node.js应用程序中的承诺

Javascript 无法使用chrome cookies安全模块解析Node.js应用程序中的承诺,javascript,node.js,asynchronous,cookies,promise,Javascript,Node.js,Asynchronous,Cookies,Promise,我正在开发一个需要访问Google Chrome Cookie的local Node.js应用程序。我已经找到了似乎可以完成这项工作的库,但我就是不知道下面的代码出了什么问题 const chrome = require('chrome-cookies-secure'); const domains = [ "google.com" ]; const resolveCookies = async () => { let result = [];

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

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
const chrome=require('chrome-cookies-secure');
常量域=[
“google.com”
];
const resolveCookies=async()=>{
让结果=[];
for(域中的域){
等待chrome.getCookies(`https://${domain}/`,(呃,cookies)=>{
结果:推送(cookies);
//console.log(cookies);//?这将正确打印结果
})
}
返回结果;
}
const final=resolveCookies();
console.log(最终版);/!这将返回一个承诺{}对象
我的想法是,我只想将来自所有域的cookie存储在一个列表中,但无论发生什么,我都无法解决承诺。 我没有看到这个模块的任何异步调用示例,但是如果我不使用它,它将在脚本执行后返回一个空列表

我的节点版本:
v14.4.0


我做错了什么?

一个
异步
函数返回一个
承诺
。 因此,您的
resolveCookies
函数也将返回您注意到的
Promise

您需要使用
链接
控制台.log
。然后
例如

resolveCookies().then(console.log);
或者,如果您需要将其设置为像
final
这样的变量,您也需要等待
承诺。在这种情况下,您需要一个
async
iLife:

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


看来
getCookies
的实现没有正确地等待异步进程。您可以看到,尽管
getCookies
本身是
async
,但它调用
getDerivedKey
而不等待它(而且该函数无论如何都不是
async

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

const util = require('util');

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

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

// ...

const cookies = await getCookies(`https://${domain}/`);
注意,正如注释中所指出的,
getCookies
实现实际上在回调之后使用了一个
profile
参数;如果需要使用该参数,则不能使用内置的
promisify
。您必须自己包装,这可能看起来像:

const getCookies = (url, format, profile) => new Promise((resolve, reject) => {
    chrome.getCookies(url, format, (err, cookies) => {
        if (err) {
            reject(err);
        } else {
            resolve(cookies);
        }
    }, profile);
});
他们是,但是公关部已经有将近九个月没有合并了


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

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}/`)));
试试这个

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)
})

resolveCookies
返回数组的承诺-
async
函数始终返回承诺。尝试
resolveCookies。然后((最终)=>console.log(最终))
@jornsharpe谢谢你的建议,但是我得到了一个
类型错误:resolveCookies.then不是一个函数。对不起,输入错误;您需要调用函数,
resolveCookies()。然后(…
是否
chrome.getCookies
确实返回了一个承诺?如果没有,则等待它将毫无帮助。瞥一眼我认为这不会正确同步。
getCookies
async
,但它不会等待它调用
getDerivedKey
,反正它不是
async
。尝试使用注释这并不是那么简单。从回调返回
Promise.resolve
不会使您的
getCookies
实现返回cookies的承诺。您甚至也不会尝试处理
错误
。仅使其
异步
也不会有帮助。我已经在我的答:非常感谢您的支持,据我所知,这是属于模块实现本身的东西。到目前为止,还没有看到关于这一点的PR:)@Void没问题,库实现(有一个
async
函数,实际上没有在正确的时间解析)非常混乱!但是请注意。Nice@jornsharpe,我刚刚阅读了您善意链接的
Util.promisify
,我相信这在所有情况下都会起作用,除了传递
profile
的情况,因为
profile
成为函数调用中的最后一个参数:->
接受遵循常见错误优先回调样式的函数,也就是说,将(err,value)=>…回调作为最后一个参数,并返回一个返回承诺的版本。
只是一个观察,因为我认为这个答案解决了OPs问题。而且我的PR看起来不太可能在短期内合并到该回购中。@ReeceDaniels啊,这是一个很好的观点;我会编辑,谢谢。不,我不会抱太多希望。。。