2014-10-09 3 views
0


У меня есть база данных mysql, архитектура сервера nodejs и мобильных клиентов.
Моя система работает в основном, мобильные клиенты контролируют базу данных через node.js.
Когда новые данные добавляют базу данных, nodejs отправляет push-уведомление всем клиентам, а клиенты запрашивают новые данные, а затем nodejs отвечают на новые данные.
Мобильные клиенты, использующие службу REST для получения данных.
Моя проблема в том,
У меня есть таблицы 3 типа в MySQL:
первый один должен проверяться каждые 15 мин,
второй один должен проверяться каждые 2 сек,
третий один должен проверяться каждые 3,5 мин от nodejs к новой проверке данных.
Nodejs Mysql Check Database

Вот мои коды без автоматической проверки базы данных:

var nodePort = 3030; 
var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var db = require('mysql'); 
var dbPool = db.createPool({ 
    host : 'localhost', 
    user : 'root', 
    password : '1234', 
    database : 'test', 
    port : 3306 
}); 

var gcm = require('node-gcm'); 
var message = new gcm.Message(); 
var sender = new gcm.Sender('AIzaSyChp2jTQsgPkLaaVgFh6yoovu1Td7tuQMo'); //Api Key 
var registrationIds = []; 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded()); 

app.get('/api/db', function(req, res){ 
    res.setHeader('content-type', 'application/json'); 
    dbPool.getConnection(function(objErr, objConn){ 
     if(objErr){ 
      sendError(res, 503, 'error', 'connection', objErr); //503 - Service Unavailable 
     }else{ 
      objConn.query("SELECT * FROM person", function(Err, Rows, Fields){ 
       if(Err){ 
        sendError(res, 500, 'error', 'query', Err); 
       }else{ 
        res.send({ 
         results : 'success', 
         err : '', 
         err_type : '', 
         fields : Fields, 
         rows : Rows, 
         length : Rows.length 
        }); 
        objConn.release(); 
       }//else 
      }); 
     }//else 
    }); 
}); 
/* 
app.get('/api/db:id', function(req, res){ 
    var id = req.params.id; 
    res.setHeader('content-type', 'application/json'); 
    dbPool.getConnection(function(objErr, objConn){ 
     if(objErr){ 
      sendError(res, 503, 'error', 'connection', objErr); //503 - Service Unavailable 
     }else{ 
      objConn.query("SELECT * FROM person WHERE id = ? ",[id], function(Err, Rows, Fields){ 
       if(Err){ 
        sendError(res, 500, 'error', 'query', Err); 
       }else{ 
        res.send({ 
         results : 'success', 
         err : '', 
         err_type : '', 
         fields : Fields, 
         rows : Rows, 
         length : Rows.length 
        }); 
        objConn.release(); 
       }//else 
      }); 
     }//else 
    }); 
}); 
*/ 
app.post('/api/db', function(req, res){ 
    if(!req.body.tableName){ 
     var data = { 
      ID : req.body.id, 
      Name : req.body.name 
     } 
     tableName = 'person'; 
    }else{ 
     var data = { 
      email : req.body.email, 
      regid : req.body.regid 
     } 
     tableName = 'users'; 
    }//else 
    console.log(req.body); 
    res.setHeader('content-type', 'application/json'); 
    dbPool.getConnection(function(objErr, objConn){ 
     if(objErr){ 
      sendError(res, 503, 'error', 'connection', objErr); //503 - Service Unavailable 
     }else{ 
      objConn.query("INSERT INTO "+tableName+" SET ? ", data, function(Err, Rows, Fields){ 
       if(Err){ 
        sendError(res, 500, 'error', 'query', Err); 
       }else{ 
        res.send({ 
         results : 'success' 
        }); 
        objConn.release(); 
        if(!req.body.tableName){ gcmSend(); } 
       }//else 
      }); 
     }//else 
    }); 
}); 

app.put('/api/db', function(req, res){ 
    var id = req.body.id; 
    var data = { 
     Name : req.body.name 
    } 
    res.setHeader('content-type', 'application/json'); 
    dbPool.getConnection(function(objErr, objConn){ 
     if(objErr){ 
      sendError(res, 503, 'error', 'connection', objErr); //503 - Service Unavailable 
     }else{ 
      objConn.query("UPDATE person SET ? WHERE ID = ? ", [data,id], function(Err, Rows, Fields){ 
       if(Err){ 
        sendError(res, 500, 'error', 'query', Err); 
       }else{ 
        res.send({ 
         results : 'success' 
        }); 
        objConn.release(); 
        gcmSend(); 
       }//else 
      }); 
     }//else 
    }); 
}); 

app.delete('/api/db/:id', function(req, res){ 

    var id = req.params.id; 
    res.setHeader('content-type', 'application/json'); 
    dbPool.getConnection(function(objErr, objConn){ 
     if(objErr){ 
      sendError(res, 503, 'error', 'connection', objErr); //503 - Service Unavailable 
     }else{ 
      objConn.query("DELETE FROM person WHERE ID = ? ",[id], function(Err, Rows, Fields){ 
       if(Err){ 
        sendError(res, 500, 'error', 'query', Err); 
       }else{ 
        res.send({ 
         results : 'success' 
        }); 
        objConn.release(); 
        gcmSend(); 
       }//else 
      }); 
     }//else 
    }); 
}); 

function gcmSend(){ 
    dbPool.getConnection(function(objErr, objConn){ 
     if(objErr){ 
      console.log('Message couldn\' t send'); 
     }else{ 
      objConn.query("SELECT * FROM registers", function(Err, Rows, Fields){ 
       for(var i=0; i<Rows.length; i++){ 
        registrationIds.push(Rows[i].regid); 
        console.log(Rows[i].regid); 
       } 
      }); 
     } 
    }); 
    message = new gcm.Message({ 
     collapseKey: 'demo', 
     delayWhileIdle: true, 
      timeToLive: 3, 
      data: { 
       title: 'Node.js den mesaj gönderildi' 
      } 
    }); 
    sender.send(message, registrationIds, 4, function (err, result) { 
     console.log(result); 
    }); 
} 

function sendError(res, iStatusCode, strResult, strType, objError){ 
    res.send({ 
     results : strResult, 
     err : objError.type, 
     err_type : strType 
    }); 
} 


app.listen(nodePort); 
console.log('App listening on port' + nodePort); 

Я хочу, чтобы автоматически проверить свою базу данных (без мобильного запроса) в течение периода времени. Поскольку данные могут быть добавлены из другой системы (не мобильной), но эта система не может уведомить nodejs-сервер.
Есть ли идеи?

+1

Посмотрите на [ 'SetTimeout/setInterval'] (http://nodejs.org/api /timers.html). – robertklep

ответ

0

Я нашел ответ на свой вопрос,
Я могу сделать с setInterval или setTimeout, но пользователь nodejs создал для него простой модуль.
Вот:

https://www.npmjs.org/package/waitjs

код ниже:

require('waitjs'); 

dbPool.getConnection(function(objErr, objConn){ 
    if(objErr){ 
     console.log('Message couldn\' t send'); 
    }else{ 
     repeat(2000, function() { 
      objConn.query("SELECT * FROM person", function(Err, Rows, Fields){ 
       for(var i=0; i<Rows.length; i++){ 
        console.log(Rows[i].Name); 
       } 
      }); 
     }); 
     repeat(900000, function() { 
      objConn.query("SELECT * FROM person", function(Err, Rows, Fields){ 
       for(var i=0; i<Rows.length; i++){ 
        console.log(Rows[i].ID); 
       } 
      }); 
     }); 
     repeat(210000, function() { 
      objConn.query("SELECT * FROM person", function(Err, Rows, Fields){ 
       for(var i=0; i<Rows.length; i++){ 
        console.log(Rows[i].ID); 
       } 
      }); 
     }); 
    } 
});