【问题标题】:Using Heroku Scheduler with Node.js在 Node.js 中使用 Heroku 调度程序
【发布时间】:2012-10-31 23:48:14
【问题描述】:

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

【问题讨论】:

    标签: node.js heroku scheduler


    【解决方案1】:

    创建文件<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 运行该脚本。

    把它变成一个脚本

    1. 删除 .js 结尾
    2. 在顶部插入“shebang”:#! /app/bin/node [1][2]
    3. 将其移至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 脚本以外的任何内容都不是很清楚。经过一些试验和错误,我设法解决了这个问题。我希望这会有所帮助。

    【讨论】:

    • 很好的答案! exit() 方法是什么(我试过这个例子,收到一个方法未定义的错误)?
    • 澄清一下,脚本必须位于项目 repo 根目录的 bin 目录中,还是 dyno 自身的 bin 中?当我执行 heroku run bash 时,我可以看到 /bin/,但我无法从 git 那里部署代码......谢谢!
    • 在 heroku bash 中询问$ which node 给了我/app/.heroku/node/bin/node 作为我的节点路径。我输入的不是 app/bin/node,它运行良好。感谢您提供详细的演练并特别注意 [2]。
    • 我用#!/usr/bin/env node代替#! /app/bin/node
    【解决方案2】:

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

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

    然后在 heroku 时间表中,您只需编写 node worker 就像您在 Procfile 中定义它一样,仅此而已!

    【讨论】:

    • 谢谢!这对我很有用,而且似乎是一种更简单的方法。
    • heroku 时间表指的是什么?这是我必须自己创建的文件吗?请澄清
    • 我需要在文件顶部添加#!/usr/bin/env node
    • 知道如何使用 node_modules 吗?
    【解决方案3】:

    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)

    【讨论】:

      【解决方案4】:

      我很困惑,没有人尝试过:

      $ heroku run node yourScript.js
      

      所以把它放在 Heroku 调度器中

      node yourScript.js
      

      为我工作。

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

      【讨论】:

        【解决方案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 starter。

        【讨论】:

          【解决方案6】:

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

          我发现以下内容对我有用,其中 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... 命令

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-08-04
            • 1970-01-01
            • 1970-01-01
            • 2018-10-19
            • 1970-01-01
            • 2016-10-23
            • 2023-03-23
            相关资源
            最近更新 更多