How to get node web client to talk to REST API on Heroku?

时间:2015-10-06 08:11:36

标签: python node.js rest heroku

I have a node web client called bidsell, and a small Python Tornado REST API called quote. Bidsell when triggered makes regular http get calls to quote. Quote duely returns random price information as json. Works locally - want to share it online, but how? Heroku looks promising. Have tried already to deploy both bidsell and quote in the same project on heroku, each running within their own heroku web dyno or deployment container. From the logs "heroku log" both are installed correctly but only one appears to be running. So I can access the front page url of bidsell, for example, but when bidsell is triggered to go fetch quote info the quote service is not found :-( Should I be using another deployment pattern?

2 个答案:

答案 0 :(得分:1)

好吧,因为jr0cket建议我创建了2个heroku项目 - 一个用于bidsell节点项目,另一个用于报价服务。

除了bidsell节点项目源文件,我还有一个包含以下内容的procfile:

web: npm start

和package.json中的脚本部分通知heroku如何启动应用程序:

 "scripts": {
   "start": "gulp serve"
 }

除了quoteService源python文件,我还有一个包含以下内容的procfile:

web: python quoteService.py

和一个包含:

的requirements.txt文件
tornado==3.1.1
pyrestful==0.4.1

在bidsell应用中有以下proxy.js作为中间件:



'use strict';

var proxyMiddleware = require('http-proxy-middleware');

var options = {
  target: 'http://quoteservce.herokuapp.com:80',
  changeOrigin: true
};

var proxy = proxyMiddleware('/quote', options);

module.exports = function(){
  return [proxy];
}




从server.js调用:



'use strict';

..
  
var middleware = require('./proxy');

module.exports = function(options) {

  function browserSyncInit(baseDir, browser) {
    browser = browser === undefined ? 'default' : browser;

    ..

    var server = {
      baseDir: baseDir,
      routes: routes
    };

    server.middleware = middleware();

    browserSync.instance = browserSync.init({
      port: (process.env.PORT || 5000),
      startPath: '/',
      server: server,
      browser: browser
    });
  }

  ..

  gulp.task('serve', ['watch'], function () {
    browserSyncInit([options.tmp + '/serve', options.src]);
  });

  ..
  
};




允许bidsell和quoteService之间的通信。有关更多背景信息,请查看here

您可以找到正在运行的应用here

可能需要一段时间才能启动闲置的自由级heroku dynos ;-)

Bidsell project on gitQuoteService project on git

答案 1 :(得分:0)

由于您的项目是两个独立的技术堆栈,最简单的方法是将它们部署为两个独立的Heroku应用程序。这为您提供了创建每个应用程序/服务所需的特定环境(语言,运行时,库)的简单方法。

您可以为指向外部Web地址的节点Web客户端创建Heroku配置变量QUOTE_REST_API。例如,使用heroku toolbelt

heroku config:set QUOTE_REST_API=https://quote-api.herokuapp.com/

在节点客户端中使用QUOTE_REST_API配置变量可以提供一种简单的方法来更改引用的地址,而无需更改代码。

  

如果您在一个Heroku应用程序中运行两个单独的项目,则需要确保web:有两个Procfile条目来启动单独的进程。只有标记为Web的进程才会收听Web流量。

     

如果您使用heroku的免费套餐,则可能无法运行两个不同的Web进程。