javascript - nodejs 异步等待流程无法正常工作

标签 javascript node.js typescript express async-await

我想创建一个用于下载视频并将该视频上传到 Youtube 的端点。

所以首先我从请求正文中获取视频 url。 其次,我将这段视频保存到临时文件夹中。 之后我将这个视频上传到 YouTube channel 最后一步是删除临时视频。

所以我的代码就这样剪掉了:

    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 - nodejs 异步等待流程无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68769865/

相关文章:

javascript - 使用 jQuery/javascript 如何检查 JS 文件 ( SP.JS) 是否已在页面中调用?

node.js - 在 Heroku 上运行的 node.js 服务器中接收从 AIR 应用程序发送的数据

javascript - 如何用 Electron fork 子进程

javascript - 我需要导入/需要一个 Node 模块 - 但它包含一个大于 4kb 的 wasm 文件。我的应用程序是一个 Electron 应用程序。我怎样才能使这项工作?

javascript - 在事件处理程序中使用另一个类的方法并绑定(bind)当前类上下文时出现 typescript 错误 TS2339

javascript - 如何设计 react 选择组件的箭头样式?

javascript - 选择具有异国情调 ID 的元素

javascript - 忽略第一个背景的透明文本

javascript - 如何在 React 中反转数组

javascript - 无法解析 ApplicationModule : (? 的所有参数)- Angular 7 JIT