有人可以告诉我为什么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);
});
答案 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();
});