【发布时间】:2012-10-31 23:48:14
【问题描述】:
实际上没有关于在 Node.js 中使用 Heroku Scheduler 的教程。假设我有一个名为 sayHello() 的函数,我想每 10 分钟运行一次。如何在控制器中使用它。在 ruby 中,您编写 rake function_name() 但是没有对 Node.js 进行解释。我可以写 '/sayHello' 还是我应该做额外的配置?
【问题讨论】:
实际上没有关于在 Node.js 中使用 Heroku Scheduler 的教程。假设我有一个名为 sayHello() 的函数,我想每 10 分钟运行一次。如何在控制器中使用它。在 ruby 中,您编写 rake function_name() 但是没有对 Node.js 进行解释。我可以写 '/sayHello' 还是我应该做额外的配置?
【问题讨论】:
创建文件<project_root>/bin/say_hello:
#! /app/.heroku/node/bin/node
function sayHello() {
console.log('Hello');
}
sayHello();
process.exit();
部署到 Heroku 并使用 $ heroku run say_hello 对其进行测试,然后将其添加到任务名称为 say_hello 的调度程序中。
以say_hello.js 为例,您通常会使用$ node say_hello.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 脚本以外的任何内容都不是很清楚。经过一些试验和错误,我设法解决了这个问题。我希望这会有所帮助。
【讨论】:
$ which node 给了我/app/.heroku/node/bin/node 作为我的节点路径。我输入的不是 app/bin/node,它运行良好。感谢您提供详细的演练并特别注意 [2]。
#!/usr/bin/env node代替#! /app/bin/node。
更好的方法是定义您的计划文件,例如worker.js,其内容如下:
function sayHello() {
console.log('Hello');
}
sayHello();
然后在 heroku 时间表中,您只需编写 node worker 就像您在 Procfile 中定义它一样,仅此而已!
【讨论】:
#!/usr/bin/env node。
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 调度器中
node yourScript.js
为我工作。
PS:一定要import你的脚本需要的一切。
【讨论】:
以下步骤适用于我的情况。
worker.js文件。
function sayHello() {
console.log('Hello');
}
sayHello();
这里有一些需要注意的地方
heroku run node worker.js来检查它是否工作。它应该在您的终端中显示“Hello”。【讨论】:
非常感谢这里以前的答案。
我发现以下内容对我有用,其中 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... 命令
【讨论】: