实际上没有关于在 Node.js 中使用 Heroku Scheduler 的教程。假设我有一个名为sayHello()的函数,我想每 10 分钟运行一次。如何在控制器中使用它。在 ruby 中,您编写rake function_name()但是没有对 Node.js 进行解释。我可以写'/sayHello'还是我应该做额外的配置?
6 回答
创建文件<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
.
把它变成一个脚本
- 删除
.js
结尾 - 在顶部插入“shebang”:
#! /app/bin/node
[1][2] - 将其移动到
bin
目录 [3]
[1] 在 Wikipedia 上阅读有关shebang 的信息。
[2]node
可执行文件安装在app/bin/node
Heroku 上。您可以通过在 Heroku 上登录 bash 来检查它,$ heroku run bash
然后询问$ which node
.
[3] Heroku 要求将脚本放在bin
目录中。请参阅在 Heroku 开发中心定义任务。
我同意 Heroku 用于调度任务的文档对于 Ruby 脚本以外的任何内容都不是很清楚。经过一些试验和错误,我设法解决了这个问题。我希望这有帮助。
更好的方法是定义您的计划文件,例如worker.js
使用以下内容:
function sayHello() {
console.log('Hello');
}
sayHello();
然后在heroku时间表中,您只需node worker
像在中定义的那样编写即可,仅此而已Procfile
!
Christophe 的回答对我有用,直到我需要将参数传递给脚本,此时它失败了。问题是node
不应在任务中指定。以下是如何使其正常工作:
在您的 Procfile 中,为您的脚本定义一个进程类型。请参阅下面的典型 Procfile,其中包含一个 Web 进程,以及运行“scheduled_job.js”的第二种进程类型,想象中地命名为“worker”。
web: node app.js worker: node scheduled_job.js
在 Heroku 调度程序的 Task 列中,只需输入带有或不带参数的进程类型的名称(在本例中为“worker”)。不要在它之前输入“节点”。Heroku 在其前面显示一个美元符号,因此有效设置的示例是
$ worker
(不带参数运行)或$ worker 123 abc
(使用参数“123”和“abc”执行 schedule_job.js)
我很困惑没有人尝试过:
$ heroku run node yourScript.js
所以把它放在 Heroku Scheduler
node yourScript.js
为我工作。
PS:确保import
你的脚本需要的一切。
以下步骤适用于我的情况。
- 在根文件夹中添加
worker.js
文件。 - 在 worker.js 中。编写一个简单的函数,如上。
function sayHello() { console.log('Hello'); } sayHello();
- 转到 heroku 调度程序附加组件。单击“添加新工作”并在字段中输入“工人”。然后设置时间间隔,点击保存。
这里有一些需要注意的地方
- 更新工作设置后。如果使用上面的示例,您可以使用
heroku run node worker.js
它来检查它是否工作。它应该在您的终端中显示“Hello”。 - 我为我的 node.js 项目使用express-babel启动器。
非常感谢这里以前的答案。
我发现以下内容对我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...
命令一起工作