Я сам начал Node.js. Я просто сделал один простой искатель, используя cheerio
и mysql
. Я получаю странную ошибку, возможно, потому что я новичок, но я не получаю выход из последних 4 часов -
var express = require('express');
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app = express();
var mysql = require('mysql');
var pool = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database: "crawler",
multipleStatements: true
});
pool.connect();
for (var i = 1; i <= 21; i++) {
request({
url: 'https://localhost/medicaljournal/category/medical-diagnostic-equipment/' + i
}, function(error, response, body) {
if (!error) {
var $ = cheerio.load(body);
var data = $('li.span2.list_product_item')
.each(function(index, element) {
var category = 'medical equipments';
var url = $(element).find('div.search-img.img-polaroid').parent().find('a').attr('href');
var thumbnail = $(element).find('div.search-img.img-polaroid').parent().find('img').attr('src');
var name = $(element).find('a.productName.clearfix').parent().text().trim();
var price = $(element).find('p.price').parent().text().trim();
var product = [
category,
name,
thumbnail,
url,
price
];
var query = "INSERT INTO healthcare_products ('category', 'name', 'image', 'url', 'cost') VALUES (?, ?, ?, ?, ?)";
console.log(product);
pool.connect(function(err, callback) {
pool.query(query, product, function(err, result) {
if (err) {
throw err;
}
console.log('result{' + index + '}=>' + result);
pool.end();
});
});
});
} else {
console.log('error=>' + error);
}
});
}
Ошибка, которую я получил,
result{0}=>[object Object]
result{1}=>[object Object]
events.js:183
throw er; // Unhandled 'error' event
^
Error: Cannot enqueue Quit after invoking quit.
at Protocol._validateEnqueue (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\Protocol.js:204:16)
at Protocol._enqueue (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\Protocol.js:139:13)
at Protocol.quit (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\Protocol.js:92:23)
at Connection.end (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\Connection.js:249:18)
at Query._callback (C:\Users\jimit\Data\Work\Projects\express_demo\server.js:48:34)
at Query.Sequence.end (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\sequences\Sequence.js:88:24)
at Query._handleFinalResultPacket (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\sequences\Query.js:139:8)
at Query.OkPacket (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\sequences\Query.js:72:10)
at Protocol._parsePacket (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\Protocol.js:279:23)
at Parser.write (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\Parser.js:76:12)
at Connection.query (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\Connection.js:208:25)
at Handshake._callback (C:\Users\jimit\Data\Work\Projects\express_demo\server.js:43:30)
at Handshake.Sequence.end (C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\sequences\Sequence.js:88:24)
at C:\Users\jimit\Data\Work\Projects\express_demo\node_modules\mysql\lib\protocol\Protocol.js:225:14
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
PS C:\Users\jimit\Data\Work\Projects\express_demo>
Я считаю, что есть что-то, связанное с одинарной цитатой или обратным тиком. Но я не оборачиваюсь.
Если вы можете использовать ES6, напишите запрос вставки следующим образом:
const product = {
category,
name,
thumbnail,
url,
price
};
connection.query("INSERT INTO healthcare_products SET ?", product, () => {...})
Вы можете увидеть пример здесь
О вашей второй ошибке, потому что вы делаете .each()
и в each()
вы закрываете свой пул с помощью pool.end()
. Просто удалите его и добавьте после выполнения вашей работы.
Чтобы использовать пул, вы можете сделать connection.release();
как он говорит здесь