javascript - nodejs异步等待流程无法正常工作
问题描述
我想创建一个端点来下载视频并将此视频上传到 Youtube。
所以首先我从请求正文中获取视频网址。其次,我将此视频保存到临时文件夹。之后,我将此视频上传到 YouTube 频道,最后一步是删除临时视频。
所以我的代码像这样剪断:
const videoUrl = req.body.video_url;
....
....
var download = async function (url: any, dest: any, cb: any) {
var file = fs.createWriteStream(dest);
var request = https.get(url, function (response: any) {
response.pipe(file);
file.on('finish', function () {
file.close(cb);
});
}).on('error', function (err: any) {
fs.unlink(dest);
if (cb) cb(err.message);
});
};
const video = await download(videoUrl, file, function () {
console.log('Video Download Successfull'); ===============> 3rd console output
});
....
....
var readStream = await fs.createReadStream(file);
readStream.on('error', function (err: any) {
});
var request: any = await Youtube.videos.insert({
resource: {
snippet: {
title: title
, description: description
}
, status: {
privacyStatus: "private"
}
}
, part: "snippet,status"
, media: {
body: readStream
}
}, (err: any, data: any) => {
if (err) {
console.log(err.response.data.error)
res.status(500).json({
status: "Fail",
message: "Youtube Video Upload Failed"
})
}
else {
try {
fs.unlinkSync(file)
console.log("temp video file deleted from server"); ===============> 1st console output
} catch (err) {
console.log("temp video file not deleted")
console.error(err)
}
res.status(200).json({
status: "Success",
message: "Youtube Video Upload Successfull"
})
console.log("Video upload to youtube Successfull."); ===============> 2nd console output
}
});
当我调用此端点时,控制台输出如下:
temp video file deleted from server
Video upload to youtube Successfull.
Video Download Successfull
但控制台输出应该是:
Video Download Successfull
Video upload to youtube Successfull.
temp video file deleted from server
为什么我的流程不正确。我该如何解决这个问题?
解决方案
你将不得不使用 Promises,这里我使用了 Promises 来下载视频功能。
const videoUrl = req.body.video_url;
....
....
var download = async function (url: any, dest: any, cb: any) {
return new Promise((resolve, reject) => {
try {
var file = fs.createWriteStream(dest);
var request = https.get(url, function (response: any) {
response.pipe(file);
file.on('finish', function () {
file.close(cb);
resolve(true)
});
}).on('error', function (err: any) {
fs.unlink(dest);
if (cb) cb(err.message);
reject(false)
});
}catch (e) {
reject(false)
}
})
};
const video = await download(videoUrl, file)
if (video){
console.log('download success')
}
....
....
var readStream = await fs.createReadStream(file);
readStream.on('error', function (err: any) {
});
var request: any = await Youtube.videos.insert({
resource: {
snippet: {
title: title
, description: description
}
, status: {
privacyStatus: "private"
}
}
, part: "snippet,status"
, media: {
body: readStream
}
}, (err: any, data: any) => {
if (err) {
console.log(err.response.data.error)
res.status(500).json({
status: "Fail",
message: "Youtube Video Upload Failed"
})
}
else {
try {
fs.unlinkSync(file)
console.log("temp video file deleted from server"); ===============> 1st console output
} catch (err) {
console.log("temp video file not deleted")
console.error(err)
}
res.status(200).json({
status: "Success",
message: "Youtube Video Upload Successfull"
})
console.log("Video upload to youtube Successfull."); ===============> 2nd console output
}
});
推荐阅读
- javascript - 反应脚本构建服务工作者不缓存自定义文件
- ios - 片段着色器中的纹理读取
- google-analytics - Google Analytics 中的子目录跟踪
- javascript - 日期时间选择器标记值
- c# - 在 Foreach 循环中使用谓词生成器时遇到问题
- java - Vaadin Tabsheet 不希望刷新选项卡内容
- javascript - 如何使用 VueJS 动态添加属性?
- ruby - 我可以在 rbenv 中创建沙盒 gem 环境吗?
- ubuntu - 如何在 Ubuntu 16.04 上离线安装 Tensorflow 和 Cuda?
- import - SAP HANA:将数据从 CSV 文件插入/导入表的最高效方式