Node+fs+定时器(node-schedule)+MySql

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

目标:将本人写博客时候的截图保存到桌面的图片    

        执行保存到指定文件进行整理

        并写入数据库

先看最终的目录结构:

package.json文件:

复制代码
{
  "name": "zqz",
  "dependencies": {
    "mysql": "^2.10.2",
    "node-schedule": "^1.1.0"
  }
}
复制代码

通过npm install node-schedule --save //--save的作用是将其加入package.json的dependencies(依赖项中)

 

2个依赖项:

node-schedule https://github.com/node-schedule/node-schedule 定时器

mysql https://github.com/felixge/node-mysql mysql

 

app.js文件

复制代码
var schedule = require('node-schedule');
var mysql = require('mysql');
var fs = require('fs');
const desktopPath = 'C:/Users/Administrator/Desktop/';
const targetPath = 'F://Blog_ScreenShot//';
const metaInfo = 'blog';
var operationType = {
    0 : '插入',
    1 : '删除',
    2 : '修改',
    3 : '查询'
}

/**
 * 轮询桌面
 * @return {[type]} [description]
 */
function timePoll(){
    console.log('--------[开始轮询]----------')
    schedule.scheduleJob('30 * * * * *', function(){
        visitDesk();
          console.log('每分钟的30s都会执行!:' + (new Date).toLocaleTimeString());
    }); 
}

/**
 * 访问桌面
 * @return {[type]} [description]
 */
function visitDesk(){
    console.log('--------开始访问桌面----------')
    fs.readdir(desktopPath,function(err, files){
       if (err) {
           return console.error(err);
       }

           files.forEach( function (file){
              if(file && judgeImage(file)){
                   saveImageToFile(file);
              }else{
                   console.log('桌面无资源!');
                   return;
              }

           });
    });
}

/**
 * 判断文件类型,取出我们需要的png图片
 * @return {[type]} [description]
 */
function judgeImage(file){
    var postfix = getPostfix(file);
    if(postfix === 'png' && file.indexOf(metaInfo) > -1){
        return file;
    }
}

function getPostfix(file){
    var dotIndex = file.indexOf('.');
    var fileLen = file.length;
    return file.substring(dotIndex+1,fileLen);
}

/**
 * 将获取的图片存入
 * pipe,它以用来把当前的可读流和另外一个可写流连接起来。可读流中的数据会被自动写入到可写流中
 * @return {[type]} [description]
 */
function saveImageToFile(file){
    var fileReadStream = fs.createReadStream(desktopPath + file);
    var lastPath = targetPath + createDateFolder();
    if(!isFolderHave(lastPath)){
        createLastFloder(lastPath);
    }
    var fileWriteStream = fs.createWriteStream(lastPath + file);
    fileReadStream.pipe(fileWriteStream);
    fileWriteStream.on('close',function(){
          console.log('复制成功!');
          deleteDeskImage(file);
          //写入数据库
          connectMysql(file, lastPath, '0');
    })
}

/**
 * 删除桌面文件
 * @param  {[type]} file [description]
 * @return {[type]}      [description]
 */
function deleteDeskImage(file){
    fs.unlink(desktopPath + file, function(){
        console.log('删除成功!')
    })
}

/**
 * 以系统时间创建文件夹/年月日
 * @return {[type]} [description]
 */
function createDateFolder(){
    var day = (new Date).getDate();
    var month = (new Date).getMonth()+1;
    var year = (new Date).getFullYear();
    return year + '_' + month + '_' + day + '//';
}

/**
 * 判断文件夹是否存在
 * @return {[type]} [description]
 */
function isFolderHave(lastPath){
    fs.exists(lastPath, function(exists){
        if(exists){
            return true;
        }else{
            return false;
        }
    })
}

/**
 * 创建最终目标文件夹
 * @param  {[type]} lastPath [description]
 * @return {[type]}          [description]
 */
function createLastFloder(lastPath){
    fs.mkdir( lastPath, function(){
        console.log('[文件夹创建]-' +lastPath + "成功!");
    })
}

/**
 * 连接数据库
 * @return {[type]} [description]
 */
function connectMysql(picname, picurl, time){
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : 'root',
      database : 'nodejs'
    });

    connection.connect(function(err){
        if(err){
            console.log(err);
            return;
        }
        console.log('连接成功!');
    });

    saveToDataBase(connection, picname, picurl);
    
    connection.end(function(err){
        if(err){
            return;
        }
        console.log('关闭连接成功!');
    });
}

/**
 * 将数据存入数据库,进行持久化
 * @return {[type]} [description]
 */
function saveToDataBase( connection, picname, picurl){
    var  querySql = 'INSERT INTO scaingDeskImg(Id,picname,picurl,time) VALUES(0,?,?,?)';
    
    //注意存入数据库中的数据如果有中文会出现,乱码错误,导致执行失败!
    var  querySql_Params = [picname, targetPath+picurl+picname, new Date];
    
    operationDataBase( connection,querySql, querySql_Params, operationType['0']);
}

/**
 * 对数据库的操作
 * @return {[type]} [description]
 */
function operationDataBase( connection, querySql, querySql_Params,flag){
    connection.query( querySql, querySql_Params, function (err, result) {
        if(err){
         console.log('[' + flag + 'ERROR] - ',err.message);
         return;
        }        

       console.log(flag + '成功!'); 
    });
}

timePoll();
复制代码

结果

涉及的知识:

 定时器:

schedule.scheduleJob('30 * * * * *', function(){
    visitDesk();
      console.log('每分钟的30s都会执行!:' + (new Date).toLocaleTimeString());
}); 

定时器中的第一个参数:

 秒  分   时    日   月    周 

*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    |
│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
│    │    │    │    └───── month (1 - 12)
│    │    │    └────────── day of month (1 - 31)
│    │    └─────────────── hour (0 - 23)
│    └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)

例如:

30 * * * * * 就表示每分钟的30秒执行

30 2 * * * * 就表示每小时的2分30秒执行

30 2 21 * * * 就表示每天的21点2分30秒执行

30 2 21 8 * * 就表示每月的8号21点2分30秒执行

...依次类推

 

读写文件:

//从桌面将文件读入流

var fileReadStream = fs.createReadStream(desktopPath + file);

//从要存入的文件创建写入流

var fileWriteStream = fs.createWriteStream(lastPath + file);

//最后通过node的pipe()的方法连接两个数据流,犹如管道一样将数据读入写入

 

  fileReadStream.pipe(fileWriteStream);

具体的可以参见API。

转载:http://www.cnblogs.com/zqzjs/p/5491349.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
65 0
|
28天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
1月前
|
缓存 监控 JavaScript
Node.js中基于node-schedule实现定时任务之详解
Node.js中基于node-schedule实现定时任务之详解
83 0
|
1月前
|
SQL JavaScript 关系型数据库
Node.js 连接 MySQL
10月更文挑战第9天
19 0
|
2月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
43 0
Node服务连接Mysql数据库
|
3月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
60 3
|
5月前
|
JavaScript 前端开发 关系型数据库
Node.js 连接 MySQL
Node.js 连接 MySQL
55 5
|
4月前
|
JavaScript
【Node.js基础02】fs、path模块
【7月更文挑战第17天】
24 0
|
5月前
vue.js+node.js+mysql在线聊天室源码
vue.js+node.js+mysql在线聊天室源码 技术栈:vue.js+Element UI+node.js+socket.io+mysql
169 3
|
5月前
|
JavaScript 安全 前端开发
【Node.js】从入门到精通(一)—— fs 模块全解析
【Node.js】从入门到精通(一)—— fs 模块全解析
105 0