如何将资产从node.js上传到github版本

时间:2014-10-31 15:29:42

标签: node.js github-api

我正在尝试在程序化创建的Github版本上自动发布一些资产。

这是我的上传功能:

function uploadFile(fileName, uploadUrl, callback){

  var uploadEndPoint = url.parse(uploadUrl.substring(0,uploadUrl.indexOf('{')));

  options.host = uploadEndPoint.hostname;
  options.path = uploadEndPoint.pathname+'?name=' + fileName;
  options.method = 'POST';
  options.headers['content-type'] = 'application/zip';

  var uploadRequest = https.request(options, callback);

  uploadRequest.on('error', function(e) {
    console.log('release.js - problem with uploadRequest request: ' + e.message);
  });

  var readStream = fs.ReadStream(path.resolve(__dirname,'builds',fileName));
  readStream.pipe(uploadRequest);

  readStream.on('close', function () {
    req.end();
    console.log('release.js - ' + fileName + ' sent to the server');
  });
}

在这结束时我得到了404未找到

我尝试使用令牌和用户/密码验证

我检查了网址

我虽然可能是因为SNI,但我不知道如何检查。

有任何线索吗?谢谢!

1 个答案:

答案 0 :(得分:4)

我通过不使用低级node.js模块并使用restler来找到解决该问题的方法,而restler是一个处理SNI的库。

以下是如何使用它:

  rest = require('restler'),
  path = require('path'),
  fs = require('fs');

  fs.stat(path.resolve(__dirname,'builds',fileName), function(err, stats){
    rest.post(uploadEndPoint.href+'?name=' + fileName, {
      multipart: true,
      username: GITHUB_OAUTH_TOKEN,
      password: '',
      data: rest.file(path.resolve(__dirname,'builds',fileName), null, stats.size, null, 'application/zip')
    }).on('complete', callback);
  });

希望能帮助某人:)

2015年2月27日编辑:我们最近从request切换到get request

var 
 request  = require('request'),
 fs = require('fs');

var stats = fs.statSync(filePath);

var options = {
  url: upload_url.replace('{?name}', ''),
  port: 443,
  auth: {
    pass: 'x-oauth-basic',
    user: GITHUB_OAUTH_TOKEN
  },
  json:true,
  headers: {
    'User-Agent': 'Release-Agent',
    'Accept': 'application/vnd.github.v3+json',
    'Content-Type': 'application/zip',
    'Content-Length': stats.size
  },
  qs: {
    name: assetName
  }
};

// Better as a stream
fs.createReadStream(filePath).pipe(request.post(options, function(err, res){
  // Do whatever you will like with the result
}));

可以通过现有版本的the response directly after the release creation或{{3}}检索upload_uri。