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

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

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

        并写入数据库

先看最终的目录结构:

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

时间: 2024-12-31 04:52:14

Node+fs+定时器(node-schedule)+MySql的相关文章

究竟什么是Node.js?Node.js有什么好处?_node.js

Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码. 简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:"Node 究竟是什么东西?" 即便是在参阅 Node 的主页之后,您甚至可能还是 不明白 Node 为何物?Node 肯定不适合每个程序员,但它可能是某些程序员一直苦苦追寻的东西. 为试图解

什么是Node.js?Node.js详细介绍_node.js

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:"Node 究竟是什么东西?"尽管不是针对所有人的,但 Node 可能是某些人的正确选择. 为试图解释什么是 Node.js,本文探究了它能解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 何时是和何时不是一个好的解决方案.本文不涉及如何编写一个复杂的 Node 应用程序,也不是一份全面的 Node 教程.阅读本文应该有助于您决定是否应该学习 Node,以便将其用于您的业务

单链表-C语言求教merge(struct node *p,struct node *q)哪里出错了?

问题描述 C语言求教merge(struct node *p,struct node *q)哪里出错了? #include "stdio.h" #include "stdlib.h" struct node { int data; struct node next; }; struct node *creat(int *a) { struct node*h,*p,*q; int i; h=p=(struct node)malloc(sizeof(struct nod

Node.js中JavaScript操作MySQL的常用方法整理_node.js

一.建立数据库连接:createConnection(Object)方法      该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database.与php中链接数据库的参数相同.属性列表如下: host: 连接数据库所在的主机名. (默认: localhost)  port: 连接端口. (默认: 3306)  localAddress: 用于TCP连接的IP地址. (可选)  socketPath: 链接到unix域的路径.在使用host和port时

node.js-关于Node.js等待异步返回结果的问题。

问题描述 关于Node.js等待异步返回结果的问题. 懂Node.js的大神帮忙解决各位问题吧!!问题:mysql查询数据的函数,返回查询结果,但由于query异步,因此该函数在未查询到结果前已经返回,代码如下:function func_GetTableCount(tableName) { var json = ''; if (connection != null) { var sql = ""SELECT * FROM "" + tableName; conne

利用Node.js为Node.js生成HttpStatusCode辅助类并发布到npm

      作为一个好的Restfull Api不仅在于service url的语义,可读性,幂等,正交,作为http状态码也很重要,一个好的Http Status Code给使用者一个很好的响应,比如200表示正常成功,201表示创建成功,409冲突,404资源不存在等等.所以在做一个基于node.js+mongodb+angularjs的demo时发现node.js express没有提供相应的辅助类,但是本人不喜欢将201,404这类毫无语言层次语义的东西到处充斥着,所以最后决定自己写一个

node js-安装node.js的express框架,竟然出现那么多报错!

问题描述 安装node.js的express框架,竟然出现那么多报错! 最近,我想用node.js编写一些小的功能,但是,安装node.js就出现了问题,我想安装express框架,结果出现了下图的状况,请node.js的高手帮忙解答,为何我安装express会出现那么多报错! 解决方案 在mac和linux下安装node没有任何问题,因为根本不用安装,直接就可以使用bin文件 解决方案二: http://jingyan.baidu.com/article/456c463b60fb380a583

「开往春天的 Node.js」 - Node 地下铁第二期线下沙龙总结

前言 寒冬已逝,春之伊始. 3 月 26 日下午,Node 地下铁第 2 次线下沙龙在上海世博展览馆万信酒店举行.本次沙龙邀请了四位在不同领域应用 Node.js 进行探索的大牛,带着我们在温暖的午后,感受 Node.js 的魅力. 虽然当天是近来久违的好天气,而且会场地点有些偏,但这些都没有令同学们对 Node.js 的热情衰减,13 点半签到,很快会议室的位置所剩无几了,在这里,组委会感谢各位同学的支持. 回顾 Node.js 源站的发展与挑战 淘宝首页是淘宝很重要的一个页面,它原本一直运行

node.js-关于node + express()4.x

问题描述 关于node + express()4.x 最近拿node + epress + mongodb做一个练手的项目时node控制台输出warning (node) warning: possible EventEmitter memory leak detected. 11 reconnect listeners added. Use emitter.setMaxListeners() to increase limit. 我知道是超过了监听数的限制,但是当添加修改emitter.set