计算节点/ JavaScript MySQL回调中的错误情况实例

时间:2016-10-06 11:28:12

标签: javascript node.js

有人可以告诉我为什么countDups总是会向0阐明,并且回调countDups += 1;中的作业mySQLCallback不受尊重?

我应该在哪里使用console.log(countDups)来获取错误'ER_DUP_ENTRY'被抛出的次数?

我已尝试代码中的所有位置,并在每个函数内部/外部声明变量countDups

我意识到我可以在console.log(countDups)循环中.each并打印出每个增量 - 但我只对countDups的最终值感兴趣,而不是每次迭代时的值。 [感谢Svabael]

编辑 - 有趣的是,我可以使用promises或异步库来完成这项工作,但不能使用下面的标准回调。所以感谢有关其他方法的任何建议,但我特别感兴趣的是标准回调。

'use strict';

const url = require('url'),
fs = require('fs'),
cheerio = require('cheerio'),
moment = require('moment'),
mysql = require('mysql'),
request = require('request');

var connection = mysql.createConnection({
  host     : 'host',
  user     : 'user',
  password : 'pass',
  database : 'db'
});


var opt = {
    url: "http://www.google.co.uk/",   
    json: "",
    credentials: "",
    method: 'GET'
};


var countDups = 0;


var mySQLCallback = function(err, rows, fields) {

    if (err && err.code == 'ER_DUP_ENTRY'){

        countDups += 1;

        return;

      }
 };

request(opt, function(err, response, body) {

    if(err) {
        console.log(err);
    }

    var $ = cheerio.load(body);

    var tds = $('element');

    tds.each(function(){

        if (err) throw err;

        var type = $(this);

        var typeObj = {TYPE:type};

        connection.query('INSERT INTO TABLE SET ?', urlObj , mySQLCallback);

    });



    connection.end();

    console.log(countDups);



});

1 个答案:

答案 0 :(得分:0)

在您现在拥有console.log的地方,它将无效,因为您在查询执行的回调中增加了计数器,这是异步操作。如果将console.log放在错误块内,那么当您发现错误时,您应该能够看到计数器增加。

修改 绝对有更优雅的方法来做到这一点。在这种情况下,我使用了一个扮演信号量角色的变量。在每个tds.each迭代中,我们都在增加var,每次我们从查询中得到响应时,我们都会减少它。当它为零时,意味着我们可以安全地返回结果。

'use strict';

const url = require('url'),
  fs = require('fs'),
  cheerio = require('cheerio'),
  moment = require('moment'),
  mysql = require('mysql'),
  request = require('request');

var connection = mysql.createConnection({
  host: 'host',
  user: 'user',
  password: 'pass',
  database: 'db'
});

var opt = {
  url: "http://www.google.co.uk/",
  json: "",
  credentials: "",
  method: 'GET'
};

var countDups = 0;

function getLastCount (countDups) {
  console.log(countDups);
}

request(opt, function (err, response, body) {
  if (err) {
    console.log(err);
  }

  var $ = cheerio.load(body);

  var tds = $('element');
  var i = 0;

  tds.each(function () {
    if (err) { 
      throw err;
    }

    i++;

    var type = $(this);

    var typeObj = { TYPE: type };

    connection.query('INSERT INTO TABLE SET ?', urlObj, function (err, rows, fields) {
      if (err && err.code == 'ER_DUP_ENTRY') {
        countDups += 1;
        console.log(countDups);
      }

      i--;

      if (i === 0) {
        getLastCount(countDups);
      }

    });
  });

  connection.end();
});