NodeJS MySQL转储

NodeJS MySQL转储,第1张

NodeJS MySQL转储

编写的代码甚至都没有保存到我的文件中。似乎有一些问题。不知道这是实际的代码还是某些内容丢失在复制粘贴中。但是,根据您所拥有的:

一个很大的问题是,您永远不会使用connection.connect()连接到代码中的数据库。

连接后要运行的代码应位于connection.connect()回调内部。例如

connection.connect(function (err, empty) {    if (err)        throw new Error ('Panic');    // if no error, we are off to the races...}

但是,即使您快速重构代码以将最后几行换行到该get连接回调中,您仍然会遇到问题,因为在进行各种SQL调用之前您正在销毁连接,因此您将需要移动代码进入某种最终回调。

即使这样做了,您仍然会有一个空文件,因为您是从“ SHOW
TABLES”回调中调用save_backup,而不是通过内部回调实际填充它之后,在内部回调中您会获得CREATE TABLE语句并填充备份属性。

这是对代码的最小重写,可以完成您的预期工作。要注意的重要事项是“计数器”,它管理何时写入文件和关闭连接。如果属于我,我会进行其他更改,包括:

  • 用“自我”代替“我”
  • 使用数字for循环而不是for(… in …)语法
  • 我自己的回调属于(err,stuff)的节点约定
  • 更实质性的变化是,我将使用Promise重写此代码,因为这样做可以使您深深地陷入嵌套回调的内在困惑中。我个人喜欢Q库,但是这里有几种选择。

希望这会有所帮助。

var mysql_backup = function(){    this.backup = '';    this.mysql = require('mysql');    this.init = function(){        this.connection = this.mysql.createConnection({ user     : 'root', password : 'root', database : 'test'        });    };    this.query = function(sql, callback) {        this.connection.query(sql, function (error, results, fields) { if (error) {     throw error; } if (results.length  > 0) {     callback(results); }        });    };    this.get_tables = function(callback){        var counter = 0;        var me = this;        this.query('SHOW TABLES', function(tables) {     for (table in tables){         counter++;         me.query(  'SHOW CREATE TABLE ' + tables[table].Tables_in_mvc,  function(r){      for (t in r) {          me.backup += "DROp TABLE " + r[t].Table + "nn";          me.backup += r[t]["Create Table"] + "nn";      }      counter--;      if (counter === 0){          me.save_backup();          me.connection.destroy();      }  }         )     } });    };    this.save_backup = function(){        var fs = require('fs');        fs.writeFile("./backup_test.txt", this.backup, function(err) { if(err) {     console.log(err); } else {     console.log("The file was saved!"); }        });    }};var db = new mysql_backup;db.init();db.connection.connect(function (err){    if (err) console.log(err);    db.get_tables(function(x){;});});

更新:如果您感到好奇,这是一个使用Promise进行了广泛评论的实现。请注意,由于没有说明Q承诺库功能的注释,它比原始版本要短一些,并且还提供了更全面的错误处理。

var MysqlBackup = function(connectionInfo, filename){    var Q = require('q');    var self = this;    this.backup = '';    // my personal preference is to simply require() inline if I am only    // going to use something a single time. I am certain some will find    // this a terrible practice    this.connection = require('mysql').createConnection(connectionInfo);    function getTables(){        //  return a promise from invoking the node-style 'query' method        //  of self.connection with parameter 'SHOW TABLES'.        return Q.ninvoke(self.connection,'query', 'SHOW TABLES');    };    function doTableEntries(theResults){        // note that because promises only pass a single parameter around,        // if the 'denodeify-ed' callback has more than two parameters (the        // first being the err param), the parameters will be stuffed into        // an array. In this case, the content of the 'fields' param of the        // mysql callback is in theResults[1]        var tables = theResults[0];        // create an array of promises resulting from another Q.ninvoke()        // query call, chained to .then(). Note that then() expects a function,        // so recordEntry() in fact builds and returns a new one-off function        // for actually recording the entry (see recordEntry() impl. below)        var tableDefinitionGetters = [];        for (var i = 0; i < tables.length ; i++){ //  I noticed in your original pre that your Tables_in_[] did not //  match your connection details ('mvc' vs 'test'), but the below //  should work and is a more generalized solution var tableName = tables[i]['Tables_in_'+connectionInfo.database]; tableDefinitionGetters.push(Q.ninvoke(self.connection, 'query', 'SHOW CREATE TABLE ' + tableName)       .then(recordEntry(tableName)) );        }        // now that you have an array of promises, you can use Q.allSettled        // to return a promise which will be settled (resolved or rejected)        // when all of the promises in the array are settled. Q.all is similar,        // but its promise will be rejected (immediately) if any promise in the        // array is rejected. I tend to use allSettled() in most cases.        return Q.allSettled(tableDefinitionGetters);    };    function recordEntry (tableName){        return function(createTableQryResult){ self.backup += "DROP TABLE " + tableName + "nn"; self.backup += createTableQryResult[0][0]["Create Table"] + "nn";        };    };    function saveFile(){        // Q.denodeify return a promise-enabled version of a node-style function        // the below is probably excessively terse with its immediate invocation        return (Q.denodeify(require('fs').writeFile))(filename, self.backup);    }    // with the above all done, now you can actually make the magic happen,    // starting with the promise-return Q.ninvoke to connect to the DB    // note that the successive .then()s will be executed iff (if and only    // if) the preceding item resolves successfully, .catch() will get    // executed in the event of any upstream error, and finally() will    // get executed no matter what.    Q.ninvoke(this.connection, 'connect')    .then(getTables)    .then(doTableEntries)    .then(saveFile)    .then( function() {console.log('Success'); } )    .catch( function(err) {console.log('Something went awry', err); } )    .finally( function() {self.connection.destroy(); } );};var myConnection = {    host     : '127.0.0.1',    user     : 'root',    password : 'root',    database : 'test'};// I have left this as constructor-based calling approach, but the// constructor just does it all so I just ignore the return valuenew MysqlBackup(myConnection,'./backup_test.txt');


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5062266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存