实际上没有关于在Node.js中使用Heroku Scheduler的教程。假设我有一个名为 sayHello()的函数,我想每10分钟运行一次。我怎样才能在控制器中使用它。在ruby中你写 rake function_name()但是没有解释Node。我可以写'/ sayHello'或者我应该做额外的配置吗?
答案 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脚本的示例。
通过
将其转换为脚本.js
结尾#! /app/bin/node
[1] [2] bin
目录[3] [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
。以下是如何使其正常工作:
在Procfile中,为脚本定义进程类型。请参阅下面的典型Procfile与Web进程,并运行“scheduled_job.js”,第二个进程类型富有想象力地命名为“worker”。
web: node app.js worker: node scheduled_job.js
在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)
以下步骤适用于我的情况。
worker.js
文件。
function sayHello() {
console.log('Hello');
}
sayHello();
以下是应注意的事项
heroku run node worker.js
检查它是否有效。这应该是显示你好&#39;在你的终端。答案 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
:
要在本地运行feed.js
节点js脚本,可以从项目目录node bin/feed.js
的根目录使用,要通过heroku运行,可以使用heroku run feed.js --app <APP_NAME_NOT_PIPELINE_NAME>.
。 ,这将从服务器上运行作业,而运行node bin/feed.js
的服务器将在本地运行。在本地运行以测试和验证代码是否正常运行,一旦部署,请使用heroku run...
命令