我有一个firebase函数,它将从前端获取一个文件名称的请求,这将是存储在firebase存储中的视频,然后我将应用ffmpeg并将视频提取到许多帧。最后,我会将所有帧上传到firebase存储中。 一切都很好,我能够得到所有帧。但是,上传帧时存在问题。有时我可以成功上传所有帧,但该功能将一直运行直到超时,有时我只能上传第一帧。我是node.js的新手。我想返回或承诺存在问题(我不会放弃了解返回的内容以及如何处理承诺)。 另外,我想将每个帧的数据写入数据库。我应该把这部分代码放在哪里?
exports.extractFrame = functions.https.onRequest(function (req, res) {
const name = req.query.fileName;
const username = name.substr(0, name.length - 4);
const sessionId = 'video-org';
const framePath = 'frame-org';
const sourceBucketName = 'this is my bucket name';
const sourceBucket = gcs.bucket(sourceBucketName);
const temDir = os.tmpdir();
return sourceBucket.file(sessionId + '/' + name).download({
destination: temDir + '/' + name
}
).then(() => {
console.log('extract frames');
return spawn(ffmpegPath, ['-i', temDir + '/' + name, temDir + '/' +
username + '%d.png']);
}).then(() => {
const frames = fs.readdirSync(temDir);
console.log(frames);
for (let index in frames) {
if (index != 0) {
console.log('uploading');
sourceBucket.upload(temDir + '/' + frames[index], {destination:
framePath + '/' + frames[index]});
}
}
}).then(() => {
res.send('I am done');
});
});
非常感谢你的帮助!!
答案 0 :(得分:1)
将所有对sourceBucket.upload()
的调用中的所有promise收集到一个数组中,然后使用Promise.all()在发送响应之前等待整个集合解析:
const promises = [];
for (let index in frames) {
if (index != 0) {
console.log('uploading');
const p = sourceBucket.upload(temDir + '/' + frames[index], {destination:
framePath + '/' + frames[index]});
promises.push(p);
}
}
return Promise.all(promises);
此外,您不会从HTTP类型函数返回承诺。只需使用res.send()
发送回复即可结束此功能。这在documentation中提到。
答案 1 :(得分:0)
我wrote a gist这一段时间了:
// set it up
firebase.storage().ref().constructor.prototype.putFiles = function(files) {
var ref = this;
return Promise.all(files.map(function(file) {
return ref.child(file.name).put(file);
}));
}
// use it!
firebase.storage().ref().putFiles(files).then(function(metadatas) {
// Get an array of file metadata
}).catch(function(error) {
// If any task fails, handle this
});