如何使用Heroku作为API代理(Node.js)?

我尝试使用Heroku作为flickr api的一层,因为GFW阻止了flickr,也许将来还会有其他的公共API。 我可以在本地环境或AWS上运行index.js,但是无法在Heroku上运行。 我做了一些研究,看起来Heroku只支持HTTP服务器,因为它有一个dyno以外的层。 所以我写了我的代码如下:

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); }); } 

autobuild完成,但我得到506错误,当我发送POST请求到我的dyno的url。 当我运行heroku run node index.js ,会抛出以下错误消息:

 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) 

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

Heroku需要一个你没有设置的dynamic端口。