2017-06-05 16 views
1

私は、GFWがflickrや他の公開APIをブロックしているため、Flickr APIのレイヤーとしてHerokuを使用しようとしています。ローカル環境やAWSでindex.jsを実行できますが、Herokuでは実行できませんでした。私はちょっとした研究をしたし、ヘロクはHTTPサーバだけをサポートしているようだ。以下のようにだから私は私のコードを書いた:HerokuをAPIプロキシ(Node.js)として使用するには?

var http = require('http'); 
var qs = require('querystring'); 
var curl = require('request'); 
var Port = 80; 
var httpServer = http.createServer(app).listen(Port); 

function app(request, response) { 
    if(request.method === "GET") { 
    response.writeHead(401, {'Content-Type': 'text/html'}); 
    response.write('<!doctype html><html><head><title>401</title></head><body>401: Unauthorized</body></html>'); 
    response.end(); 
    } else if(request.method === "POST") { 
    if (request.url === "/") { 
     var requestBody = ''; 
     request.on('data', function(data) { 
     requestBody += data; 
     if(requestBody.length > 1e7) { 
      response.writeHead(413, 'Request Entity Too Large', {'Content-Type': 'text/html'}); 
      response.end('413: Request Entity Too Large'); 
     } 
     }); 
     request.on('end', function() { 
     var formData = qs.parse(requestBody); 
     if (formData.request === 'list') { 
      var url = 'https://api.flickr.com/services/rest/?method=flickr.photosets.getList&api_key={{insert_api_key}}&user_id={{insert_user_id}}&format=json'; 
     } else if (formData.request === 'photoset') { 
      var url = 'https://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&photoset_id=' + formData.id + '&api_key={{insert_api_key}}&user_id={{insert_user_id}}&extras=url_o&format=json'; 
     } else { 
      response.writeHead(400, 'Bad Request', {'Content-Type': 'text/html'}); 
      response.end('400: Bad Request'); 
      return; 
     } 
     getrequest(url, (err, body)=>{ 
      if (err) { 
      response.writeHead(502, 'Bad Gateway', {'Content-Type': 'text/html'}); 
      response.end('502: Bad Gateway'); 
      } else { 
      response.writeHead(200, {'Content-Type': 'text/html'}); 
      response.write(body); 
      response.end(); 
      } 
     }); 
     }); 
    } else { 
     response.writeHead(404, 'Resource Not Found', {'Content-Type': 'text/html'}); 
     response.end('<!doctype html><html><head><title>404</title></head><body>404: Resource Not Found</body></html>'); 
    } 
    } else { 
    response.writeHead(405, 'Method Not Supported', {'Content-Type': 'text/html'}); 
    return response.end('<!doctype html><html><head><title>405</title></head><body>405: Method Not Supported</body></html>'); 
    } 
}; 
function getrequest(url, callback){ 
    curl(url, (error, response, body) => { 
    if (error) { 
     callback(error); 
     return; 
    } 
    callback(null, body); 
    }); 
} 

自動構築が完了したが、私は私のダイノのURLにPOSTリクエストを送信したとき、私は506エラーを取得します。私はheroku run node index.jsを実行すると、それは次のようERRメッセージをスロー:

events.js:160 
     throw er; // Unhandled 'error' event 
    ^

Error: listen EACCES 0.0.0.0:80 
    at Object.exports._errnoException (util.js:1018:11) 
    at exports._exceptionWithHostPort (util.js:1041:20) 
    at Server._listen2 (net.js:1245:19) 
    at listen (net.js:1294:10) 
    at Server.listen (net.js:1390:5) 
    at Object.<anonymous> (/app/index.js:5:41) 
    at Module._compile (module.js:570:32) 
    at Object.Module._extensions..js (module.js:579:10) 
    at Module.load (module.js:487:32) 
    at tryModuleLoad (module.js:446:12) 

答えて

1

.listen(process.env.PORT || Port)

Herokuのは、あなたが設定されなかったの動的ポートが必要です。

関連する問題