node.js - Node JS 请求 + Express Pipe

标签 node.js express request pipe

我在将视频文件从一台服务器流式传输到另一台服务器时遇到问题。

这个脚本是我写的

var request = require("request"),
    express = require("express");

var app = express();

app.get("/cast", function(req, res) {

    var url = req.query.video;

    res.writeHead(200, {
        'Content-Type': 'video/mp4'
    });

    request({
        url: url,
        headers: {
            Referer: "http://example.com/1706398/" + url
        }
    })
        .on('response', function(response) {

            response.on('data', function(data) {
                console.log("data chunk received: " + data.length)
            });

            response.on('end', function(data) {
                console.log('Video completed');
            });

        })
        .pipe(res);

});

app.listen(8080);

但是视频响应有时有效有时会损坏,相反,如果请求的数据写入可写缓冲区并保存为视频文件,则它可以与任何 URL 一起使用。 我在代码中找不到任何错误或问题,这里有一些网址:

Here some url that I tryed: https://gist.github.com/FrancisCan/f2bb86f8ff73b45fa192

谢谢:)

最佳答案

去掉writeHead 200,当你流式传输时,你应该返回http 206结果(部分内容),而不是http200。我有与您相同的场景(将视频文件从云中的 blob 容器流式传输到角度应用程序),不需要 http200 响应。

更新:添加一些关于我如何执行此操作的代码:

AzureStorageHelper.prototype.streamBlob = function streamBlob(req, res, blob, params) {
    if(!params){
        params.container = container;
    }
    blob_service.getBlobProperties(params.container, blob, function (error, result, response) {
        if(!result) return res.status(404).end();
        if(error) return res.status(500).end();

        var blobLength = result.contentLength;
        var range = req.headers.range ? req.headers.range : "bytes=0-";
        var positions = range.replace(/bytes=/, "").split("-");
        var start = parseInt(positions[0], 10);
        var end = positions[1] ? parseInt(positions[1], 10) : blobLength - 1;
        var chunksize = (end - start) + 1;
        var options = {
            rangeStart: start,
            rangeEnd: end,
        }

        //this is what's interesting for your scenario. I used to set this up myself but it's is now handled by the Azure Storage NodejsSDK

        /*res.writeHead(206, {
            'Accept-Ranges': 'bytes',
            'Content-Range': "bytes " + start + "-" + end + "/" + blobLength,
            'Content-Type': result.contentType,
            'Content-Length': chunksize,
            'Content-MD5': result.contentMD5,
        });*/

        var options = {
            rangeStart: start,
            rangeEnd: end,
        }

//this is an API from the Azure Storage nodejsSDK I use. You might want to check the source of this method in github to see how this lib deals with the http206 responses and the piping
        blob_service.getBlobToStream(params.container, blob, res, options, function (error, result, response) {
            if (error) {
                return res.status(500).end();
            }
        });
    });

关于node.js - Node JS 请求 + Express Pipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121524/

相关文章:

node.js - 沃森视觉识别: How to find location of classified content

mysql - 使用 React.js 和 Express 删除发布到 MySQL 的帖子

javascript - Jquery ajax 请求完成但 Axios 失败

javascript - Angular 7 : How to increase the time of an angular request

node.js - Socket.io 在 2 小时不活动后自动断开连接不起作用

node.js - 在 Amazon Linux 2 中安装 Node

node.js - MongoDB 聚合和 $lookup 总是返回空数组

node.js - POST 请求在 Nodejs Expressjs MVC 应用程序中仅工作一次

node.js - 如何在 Node/Express 中编辑 Jade 图像字段?

python - 如果满足某些条件,如何从关系数据库返回值; Django