Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在MySQL中使用NodeJS承诺_Javascript_Mysql_Node.js_Bluebird - Fatal编程技术网

Javascript 在MySQL中使用NodeJS承诺

Javascript 在MySQL中使用NodeJS承诺,javascript,mysql,node.js,bluebird,Javascript,Mysql,Node.js,Bluebird,我正在尝试对库研究项目中的节点脚本进行反向工程,以便按顺序执行以下任务: 1打开并读取文件,例如“input.txt”。为简单起见,假设内容是正确格式化的SQL查询 2创建到MySQL数据库的连接 3执行由1构造的查询-假设文件中正确定义了查询 4终止与数据库的连接 我希望这些任务按顺序执行,即1-4。我没有太多使用蓝鸟的经验。以下是我迄今为止的代码摘录: //Read the input file function readFilePromise(){ return new Promi

我正在尝试对库研究项目中的节点脚本进行反向工程,以便按顺序执行以下任务:

1打开并读取文件,例如“input.txt”。为简单起见,假设内容是正确格式化的SQL查询

2创建到MySQL数据库的连接

3执行由1构造的查询-假设文件中正确定义了查询

4终止与数据库的连接

我希望这些任务按顺序执行,即1-4。我没有太多使用蓝鸟的经验。以下是我迄今为止的代码摘录:

//Read the input file
function readFilePromise(){
    return new Promise(function(resolve, reject){
        var filePath = path.join(__dirname, filename);
        //asynchronous read
        fs.readFile(filePath, 'utf8', function (err, text){
            if (err)
                reject(err);
            else
                resolve(text.split('\n'));
        });
    })
}

//create connection
function createConnectionPromise(){
    return new Promise(function (resolve, reject){
        var connection = mysql.createConnection(connectionOptions);//global
        connection.connect(function(err){
            if(err){
                console.log('Error connecting to Db');
                reject(err);
            }
            else{
                console.log('Connection established');
                resolve(connection);
            }
        });
    })
}

//do transactions
function doTransactionsPromise (data){
    return new Promise(function (resolve, reject){
        var connection = data[0];
        var lines      = data[1];
        var topPromises = [];

        lines.forEach(function(sSQL){
            var p = new Promise(function(resolve,reject){
                console.log('Add: ' + sSQL);
                makeTransaction(connection, sSQL);
                return connection;
            });
            topPromises.push(p);
        });
        resolve(topPromises);
    });
}

//make transaction    
function makeTransaction(connection, sSQL){
  connection.beginTransaction(function(err){
        function treatErro(err, connection) {
            console.log('Failed to insert data in the database . Undoing!');
            connection.rollback();
        }

    function final() {
        connection.commit(function(err) {
            if(err) {
                treatErro(err, connection);
            }
            else {
                console.log('Added: ' + sSQL);
                return connection;
            }
        });
    }

    if(err) {
        treatErro(err, connection);
    }
    else {
        connection.query(sSQL, function (err, result) {
            if(err) {
                console.log(sSQL);
                treatErro(err, connection);
            }
            else {
                id = result.insertId;
            }
        });
        final();
    }
  });
}

Promise.all([createConnectionPromise(), readFilePromise()])
   .then(doTransactionsPromise)
   .then(function(promises){
       Promise.all(promises)
           .then(function(data){
                var connection = data[0];
                connection.end();
            });
   })
   .catch(function(error) {
       console.log('Error occurred!', error);
   });
查询可以正常执行,但与数据库的连接不会终止。感谢您的帮助


PS:我相信代码可以大大改进。

我在代码中看到的可能问题是函数doTransaction

 function doTransactionsPromise (data){
   return new Promise(function (resolve, reject){
    var connection = data[0];
    var lines      = data[1];
    var topPromises = [];

    lines.forEach(function(sSQL){
        var p = new Promise(function(resolve,reject){
            console.log('Add: ' + sSQL);

            makeTransaction(connection, sSQL);
            return connection;
        });
        // P is never fullfilled.
        //Either transfer the responsibility to full-fill the promise to makeTransaction 
       // or makeTransaction function should return the promise which is full-filled by itself. 

        topPromises.push(p);
    });

    resolve(topPromises);
});
}

我还没有测试代码,但是下面的代码应该可以

    //Read the input file
    function readFilePromise(){
        return new Promise(function(resolve, reject){
            var filePath = path.join(__dirname, filename);
            //asynchronous read
            fs.readFile(filePath, 'utf8', function (err, text){
                if (err)
                    reject(err);
                else
                    resolve(text.split('\n'));
            });
        })
    }

    //create connection
    function createConnectionPromise(){
        return new Promise(function (resolve, reject){
            var connection = mysql.createConnection(connectionOptions);//global
            connection.connect(function(err){
                if(err){
                    console.log('Error connecting to Db');
                    reject(err);
                }
                else{
                    console.log('Connection established');
                    resolve(connection);
                }
            });
        })
    }

    //do transactions
    function doTransactionsPromise (data){



        var connection = data[0];
        var lines = data[1];
        var topPromises = [];

        topPromise = lines.map(function(sSQL){

            return makeTransaction(connection, sSQL);
        });

        return Promise.all(topPromises).then( function(){
              return connection;
        },function(){
            return connection;
        });


    }

    //make transaction    
    function makeTransaction(connection, sSQL){
      return new Promise(resolve, reject, function(){
          connection.beginTransaction(function(err){

            function treatErro(err, connection) {
                console.log('Failed to insert data in the database . Undoing!');
                connection.rollback();
                reject(connection);

            }

            function final() {
                connection.commit(function(err) {
                    if(err) {
                        treatErro(err, connection);
                    }
                    else {
                        console.log('Added: ' + sSQL);
                        resolve(connection);
                        return connection;
                    }
                });
            }

            if(err) {
                treatErro(err, connection);
            }
            else {
                connection.query(sSQL, function (err, result) {
                    if(err) {
                        console.log(sSQL);
                        treatErro(err, connection);
                    }
                    else {
                        id = result.insertId;
                    }
                });
                final();
            }
          });

      })  

    }

    Promise.all([createConnectionPromise(), readFilePromise()])
       .then(doTransactionsPromise)
       .then(function(connection){
            return connection.end();
       })
       .catch(function(error) {
           console.log('Error occurred!', error);
       });

谢谢你的建议。你知道怎么做吗?