Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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 错误:无法加载默认凭据--凭据正常,函数失效_Javascript_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript 错误:无法加载默认凭据--凭据正常,函数失效

Javascript 错误:无法加载默认凭据--凭据正常,函数失效,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我的所有其他函数都工作正常,并且这个函数使用有限的数据集,所以这不是一个真正的凭证问题。我似乎遇到了这些答案中描述的问题: 我获取了一大块JSON,因此我认为问题类似于超时,但我无法以这些答案中描述的相同方式添加return或await(尝试了这两种方法,但return什么都不做,而await会导致另一个错误)因为我正在循环浏览数据并编写许多文档。在过去,当我限制从API获取的结果数量时,该函数已经起作用。如何使函数保持足够长的活动时间以写入所有数据 const functions = re

我的所有其他函数都工作正常,并且这个函数使用有限的数据集,所以这不是一个真正的凭证问题。我似乎遇到了这些答案中描述的问题:

我获取了一大块JSON,因此我认为问题类似于超时,但我无法以这些答案中描述的相同方式添加
return
await
(尝试了这两种方法,但
return
什么都不做,而
await
会导致另一个错误)因为我正在循环浏览数据并编写许多文档。在过去,当我限制从API获取的结果数量时,该函数已经起作用。如何使函数保持足够长的活动时间以写入所有数据

const functions = require('firebase-functions');
const admin = require('firebase-admin');

exports.fetchPlayers = functions.pubsub
    .schedule('every Tuesday of sep,oct,nov,dec 6:00')
    .timeZone('America/New_York')
  .onRun(async context => {
        const response =  fetch(
            `<<< the endpoint >>>`,
            {<<< the headers >>>}
        )
        .then(res => {
            <<< handle stuff >>>
        })
        .then(res => res.json());

        const resObj = await response;
        const players = [];

        resObj.dfsEntries[0].dfsRows.forEach(x => {
            <<< extract the data >>>
            players.push({ id, fName, lName, pos, team, [week]: fp });
        })

        players.forEach(player =>
            admin
                .firestore()
                .collection('players')
                .doc(`${player.id}`)
                .set(player, {merge: true})
                .then(writeResult => {
                    // write is complete here
                })
        );
});
const functions=require('firebase-functions');
const admin=require('firebase-admin');
exports.fetchPlayers=functions.pubsub
.时间表(9月、10月、11月、12月的每周二6:00)
.时区(“美国/纽约”)
.onRun(异步上下文=>{
const response=fetch(
`>`,
{>}
)
。然后(res=>{
>
})
。然后(res=>res.json());
const resObj=等待响应;
常量玩家=[];
resObj.dfsEntries[0]。dfsRows.forEach(x=>{
>
push({id,fName,lName,pos,team,[周]:fp});
})
players.forEach(player=>
管理
.firestore()
.collection('玩家')
.doc(`${player.id}`)
.set(播放器,{merge:true})
。然后(writeResult=>{
//写在这里是完整的
})
);
});
为了实现此目的,您需要从函数返回一个承诺,该承诺在所有异步工作完成时解析。你不能忽视任何承诺。对承诺调用
then
是不够的,因为
then
只会返回另一个承诺。问题是您忽略了在forEach循环中生成的承诺。您需要收集数组中的所有承诺,然后使用Promise.all()创建一个可以从函数返回的新承诺。简而言之:

const promises = players.map(player => {
    return admin.firestore....set(...)
})
return Promise.all(promises)
如果您不等待所有承诺得到解决,那么函数将在异步工作完成之前提前终止并关闭