Дамп MySQL NodeJS

Я попытался написать базовый cron-скрипт для запуска и «дамп» базы данных mysql. По какой-то причине, когда он «успешно сохраняет файл», он создает файл, но он пуст. Если вместо сохранения файла я выполняю console.log, он печатает пустую строку. Любые мысли о том, что я могу делать неправильно?

Заранее спасибо.

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 me = this; me.query('SHOW TABLES', function(tables) { for (var table in tables){ me.query( 'SHOW CREATE TABLE ' + tables[table].Tables_in_test, function(r){ for (var t in r) { me.backup += "DROP TABLE " + r[t].Table + "\n\n"; me.backup += r[t]["Create Table"] + "\n\n"; } } ) } me.save_backup(); }); } 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.get_tables(); db.connection.destroy(); 

One Solution collect form web for “Дамп MySQL NodeJS”

Код, как написано, даже не попал в файл для меня. Кажется, есть несколько вопросов. Не уверен, что это фактический код или некоторые вещи потерялись в копии. Однако, исходя из того, что у вас есть:

Большим является то, что вы никогда не подключаетесь к базе данных в своем коде с помощью connection.connect ().

Код, который вы хотите запустить после подключения, должен находиться внутри обратного вызова connection.connect (). например

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

Однако, даже если вы быстро реорганизуете свой код, чтобы обернуть свои последние строки внутри этого обратного вызова соединения, у вас все еще будут проблемы, потому что вы уничтожаете соединение до того, как будут сделаны различные вызовы SQL, поэтому вам нужно будет переместить код в какой-то окончательный обратный вызов.

Даже после того, как вы это сделаете, у вас все равно будет пустой файл, потому что вы вызываете save_backup из своего обратного вызова «SHOW TABLES», а не после того, как вы действительно заполнили его через внутренний обратный вызов, где вы получаете оператор CREATE TABLE и заполняете резервное копирование.

Это минимальное переписывание кода, который будет делать то, что вы намереваетесь. Важно отметить «счетчик», который управляет, когда писать файл и закрывать соединение. Я бы внес другие изменения, если бы мои, в том числе:

  • Используя «я» вместо «меня»,
  • Использование числового цикла for, а не синтаксиса for (… in …)
  • Имея мои собственные обратные вызовы, выпадаете соглашение узла (err, stuff)
  • Более существенные изменения заключаются в том, что я переписал бы это, чтобы использовать обещания, так как это может избавить вас от печали с путаницей, присущей глубоко вложенным обратным вызовам. Мне лично нравится библиотека 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 + "\n\n"; me.backup += r[t]["Create Table"] + "\n\n"; } 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){;}); }); 

Обновление. Если вам интересно, здесь представлена ​​реализация с большим количеством комментариев с использованием обещаний. Обратите внимание, что без комментариев, объясняющих функции библиотеки обещаний 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 code 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 + "\n\n"; self.backup += createTableQryResult[0][0]["Create Table"] + "\n\n"; }; }; 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 value new MysqlBackup(myConnection,'./backup_test.txt'); 
  • FATAL ERROR: CALL_AND_RETRY_LAST Не удалось выполнить выделение - процесс из памяти
  • Как вы используете Mongoose без определения схемы?
  • Необязательные параметры поискового запроса Mongoose?
  • Как устранить ошибку «Не удается найти модуль» с помощью Node.js?
  • Могут ли mongo обновить данные массива?
  • Node.js настраивает конфигурацию, специфичную для среды, которая будет использоваться с everyauth
  • Каков пример простейшего возможного примера Socket.io?
  • NodeJS: сохранение образа с кодировкой base64 на диск
  • Mongoose, обновлять значения в массиве объектов
  • Как подключить суб-приложения express.js?
  • Как сделать массивную вставку в mySQL с помощью node.js
  • Interesting Posts

    Устанавливать ограничение на один сеанс на пользователя за раз

    Что случилось с моими «предопределенными правилами» в брандмауэре Windows? Как я могу вернуть их?

    Как я могу отказаться от Windows 10 до Windows 8?

    Доступ запрещен в папку после удаления разрешения администратора

    Не найден ресурс, который соответствует указанному имени: attr ‘android: keyboardNavigationCluster’. при обновлении до Support Library 26.0.0

    Могут ли вирусы распространяться через кабели VGA?

    Найдите n простых чисел после заданного простого числа без использования какой-либо функции, которая проверяет правильность

    Регулярное выражение в Notepad ++ 6

    Как я могу использовать внешние JAR в проекте Android?

    Apache HTTPClient SSLPeerUnverifiedException

    Не способен к серверу ping или но может RDP

    Поиск имени переменной, переданной функции

    Замена жесткого диска ноутбука с окнами из шести дюймов 8

    Чтение пароля из std :: cin

    Открытие нового окна в пространствах с Mac OS X

    Давайте будем гением компьютера.