Firebase云函数:执行完成时间

Firebase云函数:执行完成时间,firebase,google-cloud-functions,Firebase,Google Cloud Functions,我有一个图像调整云函数。当我回顾日志时,我看到函数执行花费了1014毫秒。但是在执行之后,函数仍然显示日志(正在做它应该做的事情,图像被调整大小) 那么,日志是否有延迟,或者执行该功能是否真的需要一分钟以上的时间(账单会有什么问题?) 提前谢谢 更新:这是我的代码: export const makeRoundPicture=functions.https.onCall(异步(数据、上下文)=>{ var bucket=admin.storage().bucket(); log(context

我有一个图像调整云函数。当我回顾日志时,我看到函数执行花费了1014毫秒。但是在执行之后,函数仍然显示日志(正在做它应该做的事情,图像被调整大小)

那么,日志是否有延迟,或者执行该功能是否真的需要一分钟以上的时间(账单会有什么问题?)

提前谢谢

更新:这是我的代码:

export const makeRoundPicture=functions.https.onCall(异步(数据、上下文)=>{
var bucket=admin.storage().bucket();
log(context.auth.uid);
if(context.auth.uid!=null){
wait tmp.dir(异步函数_tempDirCreated(err:any,path:any){
如果(错误)抛出错误;
var initialurl=”https://firebasestorage.googleapis.com/v0/b/myproject.appspot.com/o/“+context.auth.uid+”.jpg?alt=media”;
常量选项={
url:initialurl,
目的地:路径
}
log('Dir:',path);
等待下载。图片(选项)
.然后(异步(文件名:any)=>{
console.log('Saved');
log(文件名['filename']);
var uploadPath=filename['filename'];
var original=上传路径;
var output=path+“photo.png”;
变量大小=230;
等待总经理(原件)
.调整大小(大小、大小)
.write(输出,函数(){
gm(尺寸,尺寸,无)
.填充(输出)
.画圈(尺寸/2.05,尺寸/2.05,尺寸/2.05,0)
.write(输出,异步函数(err6:any){
console.log(err6 | |'done');
等待bucket.upload(输出{
目标:“myfolder/”+context.auth.uid+“.png”,
});
});
});
})
.catch((err4:any)=>console.error(err4))
});
}否则{
控制台日志(“未经授权的请求”);
}
});

您的问题来自混合承诺和回调API

async
/
await
语法仅在将承诺链接在一起时有效

例如,此
await tmp.dir
行并不等待
\u tempDirCreated
评估并返回其等待的承诺

wait tmp.dir(异步函数\u tempDirCreated(err:any,path:any){
/* ... */
});
//这条线马上就有人打过来
因此,简而言之,您需要采用基于承诺的API,例如
tmp promise
就地
node tmp
,或者将整个函数包装在承诺中

const tmp=require('tmp-promise');
export const makeRoundPicture=functions.https.onCall(异步(数据、上下文)=>{
如果(!context.auth){
抛出新函数.https.HttpsError('failed-premissions','必须在验证时调用函数');
}
log('Called by:',context.auth.uid);
const bucket=admin.storage().bucket();
const{path:tmpDirPath}=await tmp.dir();
常量initialurl=”https://firebasestorage.googleapis.com/v0/b/myproject.appspot.com/o/“+context.auth.uid+”.jpg?alt=media”;
常量选项={
url:initialurl,
目标:tmpDirPath
}
log('Temp Dir:',tmpDirPath);
让{filename:originalFilename}=wait download.image(选项);
log('Saved:',originalFilename);
让输出=tmpDirPath+“photo.png”;
让尺寸=230;
等待gmMakeRoundPicture(原始文件名、输出、大小);
等待bucket.upload(输出{
目标:“myfolder/”+context.auth.uid+“.png”,
});
});
函数gmMakeRoundPicture(填充路径、出入口路径、大小){
返回新承诺((解决、拒绝)=>{
总经理(加密路径)
.调整大小(大小、大小)
.write(outFilePath,异步(err)=>{
如果(错误)返回拒绝(错误);
gm(尺寸,尺寸,无)
.填充(出口通道)
.画圈(尺寸/2.05,尺寸/2.05,尺寸/2.05,0)
.write(outFilePath,(err)=>err?拒绝(err):resolve());
})
});
}

如果看不到代码,我们就没什么可说的了。很可能你做错了什么。请阅读:第一个猜测是,在计算云函数的最终
}
之后,您的操作将继续。我首先关心的不是账单的影响,而是功能是否能保证工作。请发布最小的、完整的/独立的代码,您可以使用这些代码来复制此行为]()。我添加了云函数的所有代码,谢谢!此代码的缩进不一致,使其难以阅读。你能清理一下吗?而且它在语法上看起来也不正确。您真的要将函数声明传递给
tmp.dir()
?我将尝试清理它,我使用typescript编写,没有错误,函数似乎可以工作。。。更新:清理了它我想你需要把
函数gm…size){
改成
函数gm…size){
或类似的。啊,对了。Typescript会抱怨的,但不要因为它很重要就把它注释掉。相反,如果(err){reject(err);return;}就把它改成
if(err){reject(err);return;}
。谢谢!它与代码一起上载,因为如果我对它进行注释,它会在控制台中出现此错误:TypeError:gm()。write()需要一个回调函数。是的。我自己刚刚发现了这一点,检查上面的编辑,我忘了添加一个
(err)=>
。但是由于再次使用Typescript,您可能必须将其更改为
(err)=>{err?reject(err):resolve()}
它工作得很好!(而且速度很快!)我非常感谢您为此付出的时间和努力!我已经为这个函数苦苦挣扎了好几天了&现在它终于工作得很好了!非常感谢您!祝您假期愉快!谢谢!