正峰哥哥 發表於 2020-11-28 21:07:00

Node.js实现定时任务

<p>我曾经想要在特定时间执行特定的操作,而无需亲自运行它们。</p>
<p>在本文中,我们将研究如何在 Node 程序中创建和使用 Cron 作业。为此我们将创建一个简单的程序,该应用程序会自动从服务器中删除自动生成的&nbsp;error.log&nbsp;文件。 Cron 作业的另一个优点是,你可以安排程序以不同的时间间隔执行不同的脚本。</p>
<p>&nbsp;</p>
<h2 id="item-1">前提条件</h2>
<p>要继续学习本教程,你需要具备以下条件:</p>
<ul>
<li>在你的机器上安装的 Node</li>
<li>在你的计算机上安装有npm</li>
<li>JavaScript&nbsp;的基础知识</li>
</ul>
<p>&nbsp;</p>
<h2 id="item-2">入门</h2>
<p>首先,以下命令并为项目创建一个新的 Node 程序,然后其进行初始化:</p>
<pre><code class="hljs nginx"><span class="hljs-attribute">mkdir cron-jobs-node cd cron-jobs-node
npm init -y</span></code></pre>
<p>&nbsp;</p>
<h2 id="item-3">安装 Node 模块</h2>
<p>为了使程序正常工作,我们将需要几个依赖项。你可以通过运行以下命令来安装它们:</p>
<pre><code class="hljs nginx"><span class="hljs-attribute">npm install express node-cron fs</span></code></pre>
<p>express&nbsp;- Web 服务器</p>
<p>node-cron&nbsp;- 用于 node.js&nbsp;的纯&nbsp;JavaScript&nbsp;任务计划程序</p>
<p>fs&nbsp;- 文件系统模块</p>
<p>&nbsp;</p>
<h2 id="item-4">构建后端服务器</h2>
<p>创建一个&nbsp;index.js&nbsp;文件,然后导入必要的 Node 模块:</p>
<pre><code class="hljs css"><span class="hljs-selector-tag">touch <span class="hljs-selector-tag">index<span class="hljs-selector-class">.js</span></span></span></code></pre>
<p>编辑&nbsp;index.js&nbsp;文件,如下所示:</p>
<pre><code class="hljs php"><span class="hljs-comment">// index.js
<span class="hljs-keyword">const</span> cron = <span class="hljs-keyword">require(<span class="hljs-string">"node-cron");
<span class="hljs-keyword">const</span> express = <span class="hljs-keyword">require(<span class="hljs-string">"express");
<span class="hljs-keyword">const fs = <span class="hljs-keyword">require(<span class="hljs-string">"fs");

app = express();

[...]</span></span></span></span></span></span></span></span></code></pre>
<p>这是&nbsp;node-cron&nbsp;的入口。我们希望能够定期删除错误日志文件,而不必进行手动操作。我们将用&nbsp;node-cron&nbsp;来做到这一点。首先看一个简单的任务。将以下内容添加到你的&nbsp;index.js&nbsp;文件中:</p>
<pre><code class="hljs javascript"><span class="hljs-comment">// index.js
[...]
<span class="hljs-comment">// schedule tasks to be run on the server   
cron.schedule(<span class="hljs-string">"* * * * *", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {
   <span class="hljs-built_in">console.log(<span class="hljs-string">"running a task every minute");
});

app.listen(<span class="hljs-number">3128);
[...]</span></span></span></span></span></span></span></span></span></code></pre>
<p>现在,当我们运行服务器时将得到以下结果:</p>
<pre><code class="hljs css">&gt; <span class="hljs-selector-tag">node <span class="hljs-selector-tag">index<span class="hljs-selector-class">.js

<span class="hljs-selector-tag">running <span class="hljs-selector-tag">a <span class="hljs-selector-tag">task <span class="hljs-selector-tag">every <span class="hljs-selector-tag">minute
<span class="hljs-selector-tag">running <span class="hljs-selector-tag">a <span class="hljs-selector-tag">task <span class="hljs-selector-tag">every <span class="hljs-selector-tag">minute</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<h2 id="item-5">调度任务的时间间隔</h2>
<p>通过&nbsp;node-cron,可以安排不同时间间隔的任务。让我们看看如何使用不同的时间间隔来安排任务。在上面的示例中,我们创建了一个简单的 Cron 作业,传递给&nbsp;.schedule()&nbsp;函数的参数为 ​​* * * * *。这些参数在使用时具有不同的含义:</p>
<pre><code class="hljs javascript">* * * * * *
| | | | | |
| | | | | day <span class="hljs-keyword">of week
| | | | month
| | | day <span class="hljs-keyword">of month
| | hour
| minute
second ( optional )</span></span></code></pre>
<p>在这个例子中,如果想在每月的 21 号从服务器删除日志文件,可以把&nbsp;index.js&nbsp;更新为如下所示:</p>
<pre><code class="hljs javascript"><span class="hljs-comment">// index.js
<span class="hljs-keyword">const cron = <span class="hljs-built_in">require(<span class="hljs-string">"node-cron");
<span class="hljs-keyword">const express = <span class="hljs-built_in">require(<span class="hljs-string">"express");
<span class="hljs-keyword">const fs = <span class="hljs-built_in">require(<span class="hljs-string">"fs");

app = express();

<span class="hljs-comment">// schedule tasks to be run on the server
cron.schedule(<span class="hljs-string">"* * 21 * *", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {
    <span class="hljs-built_in">console.log(<span class="hljs-string">"---------------------");
    <span class="hljs-built_in">console.log(<span class="hljs-string">"Running Cron Job");
    fs.unlink(<span class="hljs-string">"./error.log", err =&gt; {
      <span class="hljs-keyword">if (err) <span class="hljs-keyword">throw err;
      <span class="hljs-built_in">console.log(<span class="hljs-string">"Error file succesfully deleted");
    });
});

app.listen(<span class="hljs-string">"3128");</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>当服务运行时,你将获得以下输出:</p>
<p><img src="http://api.fly63.com/vue_blog/public/Uploads/20191217/5df8dcbef1cbf.png"></p>
<blockquote>注意:要模拟本任务,可以通过在参数中设置分钟数来将间隔设置为较短的时间</blockquote>
<p>你可以在调度程序中执行任何操作。从创建文件到发送电子邮件和运行脚本的各种操作。让我们看一下更多的用例</p>
<p>&nbsp;</p>
<h2 id="item-6">用例2 - 备份数据库</h2>
<p>确保用户数据的可访问性对于任何企业都是至关重要的。万一使你的数据库因为发生意外而受到损坏,如果没有备份的话,那么一切将会变得一团糟。为了避免这种情况的发生,你还可以用 Cron 作业定期备份数据库中的现有数据。让我们来看看如何做到这一点。</p>
<blockquote>为了便于说明,我们将使用 SQLite 数据库</blockquote>
<p>首先,我们需要安装一个 Node 模块,该模块允许我们运行shell脚本:</p>
<pre><code class="hljs nginx"><span class="hljs-attribute">npm install shelljs</span></code></pre>
<p>还要安装SQLite:</p>
<pre><code class="hljs nginx"><span class="hljs-attribute">npm install sqlite3</span></code></pre>
<p>现在,通过运行以下命令来创建示例数据库:</p>
<pre><code class="hljs css"><span class="hljs-selector-tag">sqlite3 <span class="hljs-selector-tag">database<span class="hljs-selector-class">.sqlite</span></span></span></code></pre>
<p>想要每天晚上 11:59 备份数据库,请更新你的&nbsp;index.js&nbsp;文件,如下所示:</p>
<pre><code class="hljs javascript"><span class="hljs-comment">// index.js
<span class="hljs-keyword">const fs = <span class="hljs-built_in">require(<span class="hljs-string">"fs");
<span class="hljs-keyword">let shell = <span class="hljs-built_in">require(<span class="hljs-string">"shelljs");
<span class="hljs-keyword">const express = <span class="hljs-built_in">require(<span class="hljs-string">"express");

app = express();

<span class="hljs-comment">// To backup a database
cron.schedule(<span class="hljs-string">"59 23 * * *", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {
    <span class="hljs-built_in">console.log(<span class="hljs-string">"---------------------");
    <span class="hljs-built_in">console.log(<span class="hljs-string">"Running Cron Job");
    <span class="hljs-keyword">if (shell.exec(<span class="hljs-string">"sqlite3 database.sqlite.dump &gt; data_dump.sql").code !== <span class="hljs-number">0) {
      shell.exit(<span class="hljs-number">1);
    }
    <span class="hljs-keyword">else{
      shell.echo(<span class="hljs-string">"Database backup complete");
    }
});
app.listen(<span class="hljs-string">"3128");</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>现在,当你用以下命令运行服务时:</p>
<pre><code class="hljs css"><span class="hljs-selector-tag">node <span class="hljs-selector-tag">index<span class="hljs-selector-class">.js</span></span></span></code></pre>
<p>将会得到以下结果:</p>
<p><img src="http://api.fly63.com/vue_blog/public/Uploads/20191217/5df8dcd6a8e12.png"></p>
<p><span style="position: relative; left: -100000px">资源搜索网站大全 https://www.renrenfan.com.cn</span></p>
<h2 id="item-7">用例3 - 每隔 一段时间发送一次电子邮件</h2>
<p>你还可以用 Cron 作业以不同的时间间隔发送电子邮件,使你的用户了解企业的​​最新情况。例如,你可以策划一个有趣的链接列表,然后在每个星期日将它们发送给用户。要执行此操作,你需要执行以下操作。</p>
<p>通过运行以下命令来安装 nodemailer:</p>
<pre><code class="hljs nginx"><span class="hljs-attribute">npm install nodemailer</span></code></pre>
<p>完成后,更新&nbsp;index.js&nbsp;文件,如下所示:</p>
<pre><code class="hljs javascript"><span class="hljs-comment">// index.js
<span class="hljs-keyword">const cron = <span class="hljs-built_in">require(<span class="hljs-string">"node-cron");
<span class="hljs-keyword">const express = <span class="hljs-built_in">require(<span class="hljs-string">"express");
<span class="hljs-keyword">let nodemailer = <span class="hljs-built_in">require(<span class="hljs-string">"nodemailer");

app = express();

<span class="hljs-comment">// create mail transporter
<span class="hljs-keyword">let transporter = nodemailer.createTransport({
    <span class="hljs-attr">service: <span class="hljs-string">"gmail",
    <span class="hljs-attr">auth: {
      <span class="hljs-attr">user: <span class="hljs-string">"COMPANYEMAIL@gmail.com",
      <span class="hljs-attr">pass: <span class="hljs-string">"userpass"
    }
});

<span class="hljs-comment">// sending emails at periodic intervals
cron.schedule(<span class="hljs-string">"* * * * Wednesday", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">){
    <span class="hljs-built_in">console.log(<span class="hljs-string">"---------------------");
    <span class="hljs-built_in">console.log(<span class="hljs-string">"Running Cron Job");
    <span class="hljs-keyword">let mailOptions = {
      <span class="hljs-attr">from: <span class="hljs-string">"COMPANYEMAIL@gmail.com",
      <span class="hljs-attr">to: <span class="hljs-string">"sampleuser@gmail.com",
      <span class="hljs-attr">subject: <span class="hljs-string">`Not a GDPR update ;)`,
      <span class="hljs-attr">text: <span class="hljs-string">`Hi there, this email was automatically sent by us`
    };
    transporter.sendMail(mailOptions, <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">error, info) {
      <span class="hljs-keyword">if (error) {
            <span class="hljs-keyword">throw error;
      } <span class="hljs-keyword">else {
            <span class="hljs-built_in">console.log(<span class="hljs-string">"Email successfully sent!");
      }
    });
});

app.listen(<span class="hljs-string">"3128");</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>注意:出于测试目的,你需要暂时允许 Gmail 帐户进行非安全登录。</blockquote>
<p>现在,当用&nbsp;node index.js&nbsp;运行服务时,将得到以下结果:</p>
<p><img src="http://api.fly63.com/vue_blog/public/Uploads/20191217/5df8dcf41ecca.png"></p><br><br>
来源:https://www.cnblogs.com/Qooo/p/14054097.html
頁: [1]
查看完整版本: Node.js实现定时任务