请教一下大家关于Koa视频文件以流的形式返回给前端的问题

//这是上传视频文件的代码
@Post('/uploadVideo') uploadVideo(context: Koa.DefaultContext, next: Koa.Next) {
    if (context.request.files) {
        let src = 'http://127.0.0.1:80/uploadVideo/'
        for (let key in context.request.files) {
            let filename = context.request.files[key].path.split('uploadVideo\\')[1]
            return context.body = {
                code: 0,
                message: 'success',
                data: {
                    url: src + filename
                }
            }
        }
    }
    context.body = {
        code: -1,
        message: 'upload error'
    }
}

一开始我用的是 koa-static 静态文件代理的 /uploadVideo 接口返回视频文件路径,但是会出现以下错误:

Error: write ECONNRESET  
code:"ECONNRESET"  
errno:"ECONNRESET"  
headerSent:true  
message:"write ECONNRESET"

查了半天资料说是请求超时了才会出现这种情况,之后我将视频文件的代理换成了读写流:

app.use(async (context: Koa.DefaultContext, next: Koa.Next) => {
    if (context.method === 'GET' && (context.request.url as string).includes('/uploadVideo')) { //判断是不是视频文件请求
        let filename: string = context.request.url.split('uploadVideo/')[1]
        let rs = fssync.createReadStream(__dirname + '\\public\\uploadVideo\\' + filename)
        let stream = new Stream.PassThrough()
        rs.on('data', (chunk) => {
            stream.push(chunk, 'utf8')
            context.body = stream  //这是我自己尝试出来的,一开始我在end方法中输出的这个流,之后我尝试在这里输出了视频流,发现居然可以用,我想请教一下这种方式有没有问题?
        })
        rs.on('error', err => {
            console.log(err)
        })
    } else {
        await next()
    }
})

我想请教一下大佬们这种方式有没有问题?

阅读 4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题