将文件二进制数据流POST到NodeJS中的HTTPS请求(不带Express)

时间:2017-02-08 02:03:01

标签: node.js https stream github-api

我正在尝试使用GitHub Releases API通过NodeJS脚本将文件(.exe安装程序)上传到GitHub版本。该文档说我的文件必须在POST请求的正文中以原始二进制形式发送。我的安装程序超过30 MB,因此我假设我必须将其流式传输。

我无法使用外部NPM依赖项,例如Express或Request ,所以我尝试仅使用内置的HTTPS模块执行此操作。我正在努力让它发挥作用。

这是我正在尝试的内容:

// (URL below has proper values in my code)
var fullUploadUrl = url.parse("https://uploads.github.com/repos/[org]/[repo]/releases/[release id]/assets?name=myFile.exe&access_token=[GitHub access token]");
var uploadRequest = https.request({
    headers: { "Content-Type": "application/octet-stream" },
    method: "POST",
    protocol: "https:",
    hostname: fullUploadUrl.hostname,
    path: fullUploadUrl.path
}, (res) => {
    if (res.statusCode !== 201) {
        // Error
    } else {
        // Success
    }
});

var readStream = fs.createReadStream(uploadAssetPath);    
// readStream.on("end", () => {        // I have also tried with this uncommented
//    uploadRequest.end();
// });
readStream.pipe(uploadRequest);

这会立即产生400状态代码。

将二进制数据传输到HTTPS POST请求的正确方法是什么?有没有人有一个例子,说明如何在没有外部NPM依赖关系的情况下以编程方式将大型资产上传到NodeJS环境中的GitHub版本?

编辑:我们最终使用了外部request模块,因此请注意,接受的答案并不反映原始问题。

2 个答案:

答案 0 :(得分:0)

我认为:导致protocol: "https:"中的400 [错误请求] http响应。

答案 1 :(得分:0)

我认为使用外部模块会很好。我使用request将数据流式传输到另一台服务器。看看这个片段:

var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...})
var form = r.form();
form.append('my_field', 'my_value');
form.append('my_buffer', new Buffer([1, 2, 3]));
form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'});