将Heroku Scheduler与Node.js一起使用

时间:2012-11-12 14:39:45

标签: node.js heroku scheduler

实际上没有关于在Node.js中使用Heroku Scheduler的教程。假设我有一个名为 sayHello()的函数,我想每10分钟运行一次。我怎样才能在控制器中使用它。在ruby中你写 rake function_name()但是没有解释Node。我可以写'/ sayHello'或者我应该做额外的配置吗?

6 个答案:

答案 0 :(得分:81)

创建文件<project_root>/bin/say_hello

#! /app/bin/node
function sayHello() {
  console.log('Hello');
}
sayHello();
process.exit();

部署到Heroku并使用$ heroku run say_hello对其进行测试,然后将其添加到任务名称为say_hello的调度程序中。

说明

say_hello.js作为您通常使用$ node say_hello.js运行的Node.js脚本的示例。

通过

将其转换为脚本
  1. 删除.js结尾
  2. 在顶部插入'shebang':#! /app/bin/node [1] [2]
  3. 将其移至bin目录[3]
  4. [1]了解shebang on Wikipedia [2] node可执行文件安装在Heroku上的app/bin/node中。您可以通过$ heroku run bash登录Heroku上的bash然后询问$ which node来查看 [3] Heroku要求脚本放在bin目录中。请参阅Heroku开发中心的Defining Tasks

    我同意用于调度任务的Heroku文档对于Ruby脚本以外的任何内容都不是很清楚。经过一些试验和错误,我设法解决了这个问题。我希望这会有所帮助。

答案 1 :(得分:39)

更好的方法是定义名为worker.js的计划文件,其中包含以下内容:

function sayHello() {
    console.log('Hello');
}
sayHello();

然后在heroku日程表中,您只需编写node worker,就像在Procfile中定义它一样!

答案 2 :(得分:22)

Christophe的回答对我有用,直到我需要将参数传递给脚本,此时它失败了。问题是不应在任务中指定node。以下是如何使其正常工作:

  1. 在Procfile中,为脚本定义进程类型。请参阅下面的典型Procfile与Web进程,并运行“scheduled_job.js”,第二个进程类型富有想象力地命名为“worker”。

    web: node app.js
    worker: node scheduled_job.js
    
  2. 在Heroku调度程序的“任务”列中,只需输入带或不带参数的进程类型名称(本例中为“worker”)。 请勿在其前输入“node”。 Heroku在它前面显示一个美元符号,因此有效设置的示例将是$ worker(不带参数运行)或$ worker 123 abc(执行带参数“123”和“abc”的scheduled_job.js)

答案 3 :(得分:3)

我很困惑,没有人试过:

$ heroku run node yourScript.js

所以把它放在Heroku Scheduler中

node yourScript.js

为我工作。

PS:请务必import脚本需要的所有内容。

答案 4 :(得分:2)

以下步骤适用于我的情况。

  1. 在根文件夹中添加worker.js文件。
  2. 在worker.js中。写一个简单的函数,如上所述。 function sayHello() { console.log('Hello'); } sayHello();
  3. 转到heroku Scheduler加载项。点击“添加新工作”&#39;并键入&#39; worker&#39;在该领域。然后设置时间间隔并单击“保存”。
  4. 以下是应注意的事项

    1. 更新后的工作设置。如果使用上面的示例,您可以使用heroku run node worker.js检查它是否有效。这应该是显示你好&#39;在你的终端。
    2. 我在我的node.js项目中使用express-babel启动器。

答案 5 :(得分:0)

这里的先前答案非常感谢。

我发现以下内容对我有用,其中feed.js是在Heroku上作为作业运行的脚本。

<PROJECT_ROOT>/bin/feed.js

feed.js的内容开头为:

#!/usr/bin/env node

async function mediumFeed() {

  await fetch('https://medium.com/feed/stokedinfluence')

并以

结尾
}

mediumFeed();

在Heroku上,工作定义为node bin/medium_feed.js

enter image description here

enter image description here

要在本地运行feed.js节点js脚本,可以从项目目录node bin/feed.js的根目录使用,要通过heroku运行,可以使用heroku run feed.js --app <APP_NAME_NOT_PIPELINE_NAME>.。 ,这将从服务器上运行作业,而运行node bin/feed.js的服务器将在本地运行。在本地运行以测试和验证代码是否正常运行,一旦部署,请使用heroku run...命令