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

标签 node.js heroku

我尝试使用 Heroku 作为 flickr api 的一层,因为 GFW 已经屏蔽了 flickr,也许将来还会屏蔽其他公共(public) 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);
  });
}

自动构建已完成,但当我向 dyno 的 url 发送 POST 请求时,出现 506 错误。当我运行 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 || 端口)

Heroku 需要一个您未设置的动态端口。

关于node.js - 如何使用 Heroku 作为 API 代理(Node.js)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44373259/

相关文章:

node.js - Heroku 不遵守 script.start 命令

java - Heroku Procfile 命令 Java

node.js - 我的 meern 应用程序无法在 heroku 上运行。我该如何修复这个错误?

javascript - xml2js 是否保证同步并且会抛出错误?

javascript - 如何同步执行socket.io端点

javascript - 在 Virtualbox 托管的 Ubuntu 中通过 Robomongo 访问 mongodb

django - 如何在Heroku上运行Django测试

ruby-on-rails-3 - 如何防止Heroku清除acts_as_indexed建立的索引

node.js - 如何为 Heroku 设置时区

node.js - 在这种情况下使用 GET 而不是 POST 的原因是什么?