使用普通的JavaScriptð§`§»创建有用的自动化
#javascript #自动化 #learn

您是自动或手动的吗?

hi all -
继续作为应用程序制造商的开发人员社区的贡献,今天我建议讨论如何与nodejs有效地自动化任务。

所以...您每天要做几次重复的手动动作? 可能很多!ð

为什么...?因为使您的分散动作自动化是漫长而困难的。没有时间构建和自动化一个完整的过程?我也不是!

实际上,这可能比您想象的要容易。如果写作自动化使您头疼,则意味着您可能不使用正确的工具。

一种简单的方法是:增量自动化
将您的过程写入注释,然后开始编码任务的部分。因此,您可以在手动和自动操作之间交替。

我不认识您,但是个人我通过测试和原型进行学习更加自在。对我来说,实现这一目标的最佳方法是使用Markdown使用 JavaScript操场。这就是为什么我建议您give it a try to my app Znote资本化您的工作,否则不要使用您喜欢的IDE。

选择用例

现在让我们看看一个具体示例如何继续构建现成的自动化。最好的方法是开始解决自己的问题!因此,让我暴露我们的第一个用例。

当我有新的注册用户时,我必须定期

  • 使用SSH连接到我的远程数据库,
  • 用SQL查询手动提取用户
  • 在本地复制结果并与现有用户进行比较。
  • 一旦确定了新用户,
  • 我向每个新成员发送了一封欢迎电子邮件以获取他们的反馈。

SSH - mail new users diagram

在远程数据库上进行SQL查询

1-进行SQL查询

async function getSQL(sqlQuery, host, port, user, password, database) {
 const { Sequelize } = require('sequelize');
 const sequelize = new Sequelize(user, password, database, {
    dialect: "mysql"/* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */,
    host: host,
    port: port
 });

 sequelize.authenticate();
 const [results, metadata] = await sequelize.query(sqlQuery);

 sequelize.close()
 return results;
}

2-使用SSH
进行SQL查询

async function getRemoteSQL(sqlQuery) {
  const { spawn } = require('child_process');

  // connect to server (don't forget to copy your ssh-key on the remote server)
  const ssh = spawn('ssh', [
   '-L', '3307:localhost:3306',
   'user@XXX.ovh.net',
  ]);
  await sleep(4000); // wait connection
  // make SQL query (replace with your credentials)
  const data = await getSQL(sqlQuery, "localhost", 3307, "USER", "PASSWORD", "DATABASE");
  // quit
  ssh.kill();
  return data;
}

您现在只能在我的笔记中的任何地方做一个针对远程数据库的SQL查询

const users = await getRemoteSQL("select purchase_email from license;");
printJSON(users)

识别新用户

然后,我们想确定所有新用户,因为查询是最后一次运行。

function getNewUsers(incomingData, filename, key) {
  const fs = require('fs');
  let refData = [];
  try {
    refData = JSON.parse(fs.readFileSync(filename, 'utf8'))
      .map(element => key(element));
  } catch (err){}

  const delta = [];
   incomingData.forEach(obj => {
    if (refData.indexOf(key(obj))===-1) {
      delta.push(obj);
    }
  });
  printJSON(delta);
  return delta;
}

发邮件

最后,我们可以向每个新用户发送邮件。使用Google,您需要生成专用的凭据:https://support.google.com/accounts/answer/185833

function sendMail(recipients) {
  const nodemailer = require('nodemailer');

  const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      user: 'XX@gmail.com', // your gmail
      pass: 'XXX', // app credential here
   },
  });
  const result = await transporter.sendMail({
   from: '"Anthony" <XX@gmail.com>', // sender address
    to: recipients, // list of receivers (,)
    subject: "Just to know if everything is fine 😊", // Subject line
    text: "Hi 👋, Being very concerned about the quality of Znote app, I thank you for any feedback you could give me, allowing me to improve my software!",   // plain text body
    html: "Being very concerned about the <b>quality</b> of Znote app, I thank you for any feedback you could give me, allowing me to improve my software!",   // html body
  });
  printJSON(result);
}

将所有内容插入ð

仍然要通过调用不同的功能来描述我们的过程。

// get all users in remote database
const allUsers = await getRemoteSQL("select purchase_email from license;");
// show new users since last execution time
const newUsers = getNewUsers(allUsers, '/Users/alagrede/Desktop/users.json', it => it.purchase_email);
// write all users in file
fs.writeFileSync('/Users/alagrede/Desktop/users.json', JSON.stringify(allUsers));
// send mail
sendMail(newUsers.map(e=>e.purchase_email));

然后 !!

Gmail screenshot

总结

您现在拥有一堆可重复使用的功能和一个自动化过程。由于可以在其他注释上重复使用功能,因此您可以利用现有的工作并继续创建其他流程。然后导出您的脚本,准备在cron中运行它

ð我希望这个例子能激发您的灵感! 您是否觉得这篇文章有用?如果是这样,我还有很多其他示例可以与您分享。

走得更远

当您需要时,我将继续添加一些示例。

同时,开始将您的日常任务变成简单且可重复的事情,您的工作将变得更加有趣。 ð -

您可以检查我的博客ðhere

如果您想尝试znote,那是ð here (我很乐意发表任何评论)

znote screenshot