我想使用Firebase函数调整存储在Firebase存储中的图像。
基于Firebase小组提供的示例:https://github.com/firebase/functions-samples/blob/master/quickstarts/thumbnails/functions/index.js我尝试编写由数据库事件触发的函数。
以下是代码中最有趣的部分:
exports.myFunction = functions.database.ref('...').onWrite(event => {
...
// Create thumbnails
createThumbnail(1, ...);
createThumbnail(2, ...);
createThumbnail(3, ...);
...
return; // <- Is this necessary ?
});
function createThumbnail(...) {
...
return bucket
.file(originalFilepath)
.download({
destination: tempFilePath
})
.then(() => {
console.log('OK');
...
// Generate a thumbnail using ImageMagick.
return spawn('convert', [tempFilePath, '-thumbnail', dimension + 'x' + dimension + '>', tempFilePath])
.then(() => {
....
// Uploading the thumbnail.
return bucket.upload(tempFilePath, {
destination: thumbnailUrl
})
.then(() => {
...
// Save thumbnailUrl in database
return admin.database().ref(...).set(thumbnailUrl);
});
});
});
}
一切看起来都不错。但是代码永远不会转到console.log('OK');
,我收到此错误:
Error: read ECONNRESET
at exports._errnoException (util.js:1026:11)
at TCP.onread (net.js:569:26)
有人知道可能是什么错误吗?
谢谢
答案 0 :(得分:4)
问题是您正在返回一个Promise,它在所有异步作业完成之前完成。
执行此操作时:
createThumbnail(1, ...);
createThumbnail(2, ...);
createThumbnail(3, ...);
...
return;
您正在启动3个异步createThumbnail
任务,但您将立即返回。因此,Cloud Functions实例会关闭,而您的3 createThumbnail
没有时间来完成,而当您收到ECONNRESET
错误时就是这样。
每个createThumbnail
都会返回一个Promise。您需要做的是使用Promise.all
返回完成3 Promise
次承诺时完成的createThumbnail
:
const listOfAsyncJobs = [];
listOfAsyncJobs.push(createThumbnail(1, ...));
listOfAsyncJobs.push(createThumbnail(2, ...));
listOfAsyncJobs.push(createThumbnail(3, ...));
...
return Promise.all(listOfAsyncJobs); // This will ensure we wait for the end of the three aync tasks above.