私は、ページからエラーを収集してDBに格納し、グラフAPIを使用して情報を視覚的に表示するという小さな考えに取り組んでいます。ノード/ MySQLコード:〜800レコードを挿入しようとすると 'ER_PARSE_ERROR'
8つのサイトがあり、それぞれに100個のエントリがあります.1回あたり800トランザクションです。 私は各サイトをループし、エラーのテーブルをサブループして収集します。
すべての800個のエントリについて、それらのサブループのそれぞれに挿入クエリを作成すると、うまく動作しますが、非常に多くのトランザクションから数分後にメモリリークが発生します。
私は配列の配列にすべての800のエントリをキューイングしてから、各繰り返しの最後に複数の挿入を実行しようとしましたが、ER_PARSE_ERRORを取得しています。
var tabletojson = require('tabletojson');
var mysql = require("mysql");
var striptag = require("striptags");
var fs = require("fs");
var path = require('path');
var startCollector;
var iterations = 0;
var insertions = 0;
var duplicated = 0;
var datas = [];
var clients = ["ClientA", "ClientB", "ClientC", "ClientD", "ClientE", "ClientF", "ClientG", "ClientH"];
var appDir = path.dirname(require.main.filename);
var errorList = ["err1", "err2", "err3", "err4", "err5", "err6"];
var con = mysql.createPool({
host: "localhost",
user: "User",
password: "Password",
database: "errors"
});
function CollectErrors() {
startCollector = new Date();
for(var a = 0; a < clients.length; a++) {
(function(a) {
tabletojson.convertUrl("http://example.com" + clients[a] + "/page.php?limit=100", { stripHtmlFromCells: false }, function(response) {
var rs = response[0];
for(var l = rs.length-1; l > -1; l--) {
var newDate = formatDate(striptag(rs[l]["Date"]), striptag(rs[l]["Time"]));
var user = getUser(striptag(rs[l]["User"]));
var msg = striptag(rs[l]["Error"]);
var splitError = rs[l]["Error"].split("<a href=\"");
var link = getUrl(splitError[1]);
var id = getId(link);
var type = getType(striptag(splitError[0]));
var temp = [newDate, link, type, user, clients[a], id, msg];
datas.push(temp);
}
});
})(a);
}
con.getConnection(function(err, connection) {
connection.query("INSERT IGNORE INTO entries (time, url, type, author, client, uid, message) VALUES ?", [datas], function(err, rows) {
console.log(err);
});
connection.release();
datas = [];
});
setTimeout(CollectErrors, 10000);
}
function formatDate(date, time) {
var newdate = date.split("/").reverse().join("-");
var newtime = time+":00";
return newdate + " " + newtime;
}
function getUrl(uri) {
return "http://example.com/"+uri.split("\">Details")[0];
}
function getId(url) {
return decodeURIComponent((new RegExp('[?|&]' + "id" + '=' + '([^&;]+?)(&|#|;|$)').exec(url) || [null, ''])[1].replace(/\+/g, '%20')) || null;
}
function getType(error) {
for(var a = 0; a < errorList.length; a++) {
if(error.indexOf(errorList[a]) !== -1) {
return errorList[a];
}
}
return "Other";
}
function getUser(user) {
if(user == "" || user == " " || user == null) {
return "System";
}
return user;
}
CollectErrors();
私もmysql.createConnectionを試してみましたが、これも同じ問題をもたらしました。
私は過去12時間立ち往生して何が間違っているのかわかりません.Datasテーブルに文字列だけを入力しようとしましたが、同じエラーが発生しました。
setTimeoutは必須です。設定間隔ごとに無制限に実行するにはこのスクリプトが必要です。 – arleitiss
@arleitissこのモジュールでhttps://www.npmjs.com/package/node-cronを見ると、あなたのスクリプトは堪能な方法で処理できます – Grynets
この回答を受け入れています。 私は、提供された完全なソリューションを使用していませんでしたが、いくつかの部分を混在させました。 これは現在必要に応じて動作します。 – arleitiss