56

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

4

6 回答 6

91

创建文件<project_root>/bin/say_hello

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

部署到 Heroku 并对其进行测试,$ heroku run say_hello然后使用 task name 将其添加到调度程序中say_hello

解释

say_hello.js您通常使用$ node say_hello.js.

把它变成一个脚本

  1. 删除.js结尾
  2. 在顶部插入“shebang”:#! /app/bin/node[1][2]
  3. 将其移动到bin目录 [3]

[1] 在 Wikipedia 上阅读有关shebang 的信息
[2]node可执行文件安装在app/bin/nodeHeroku 上。您可以通过在 Heroku 上登录 bash 来检查它,$ heroku run bash然后询问$ which node.
[3] Heroku 要求将脚本放在bin目录中。请参阅在 Heroku 开发中心定义任务。

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

于 2012-12-19T15:48:08.407 回答
44

更好的方法是定义您的计划文件,例如worker.js使用以下内容:

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

然后在heroku时间表中,您只需node worker像在中定义的那样编写即可,仅此而已Procfile

于 2013-05-04T20:42:00.197 回答
26

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

  1. 在您的 Procfile 中,为您的脚本定义一个进程类型。请参阅下面的典型 Procfile,其中包含一个 Web 进程,以及运行“scheduled_job.js”的第二种进程类型,想象中地命名为“worker”。

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

于 2014-05-04T12:52:54.137 回答
7

我很困惑没有人尝试过:

$ heroku run node yourScript.js

所以把它放在 Heroku Scheduler

node yourScript.js

为我工作。

PS:确保import你的脚本需要的一切。

于 2018-03-28T01:28:59.787 回答
5

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

  1. 在根文件夹中添加worker.js文件。
  2. 在 worker.js 中。编写一个简单的函数,如上。 function sayHello() { console.log('Hello'); } sayHello();
  3. 转到 heroku 调度程序附加组件。单击“添加新工作”并在字段中输入“工人”。然后设置时间间隔,点击保存。

这里有一些需要注意的地方

  1. 更新工作设置后。如果使用上面的示例,您可以使用heroku run node worker.js它来检查它是否工作。它应该在您的终端中显示“Hello”。
  2. 我为我的 node.js 项目使用express-babel启动器。
于 2017-11-13T07:58:33.597 回答
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

在此处输入图像描述

在此处输入图像描述

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

于 2020-06-07T10:43:06.730 回答