【问题标题】:NodeJs Store Json from multiple requests to MySQL DBNodeJs 将来自多个请求的 Json 存储到 MySQL DB
【发布时间】:2016-05-23 19:47:12
【问题描述】:

我正在开发一个爬虫,它将检索和解析的数据存储到我的 MySQL 数据库中。 存储结果效果很好,但是在结束连接时我被卡住了。

我正在使用requestcheerioasyncmysql

// DB params
var con = mysql.createConnection({
    host: "localhost",
    user: "user",
    password: "password",
    database: "mydatabase",
});

// Open connection to DB
con.connect(function(err) {
    if (err) {
        console.log('Error connecting to Db');
        return;
    }
    console.log('Connection established');
});

// Array of Cities to crawl
var cities = ["olten", "zurich"];

// Todays Date 
var today = new Date();
...
today = dd + '.' + mm + '.' + yyyy;

// Search every city
async.each(cities, function(item, callback){    
        // The Page to crawl
        var page = "https://www.thepageto.com/search_xhr?fn=" + /*cities[i]*/ item + "&tn=&db=" + today + "&sort=trip_date&order";
        console.log("Visiting page " + page);
        request(page, function(error, response, body) {
            if (error) {console.log("Error: " + error);}
            // Check status code (200 is HTTP OK)
            console.log("Status code: " + response.statusCode);
            if (response.statusCode === 200) {
                // Parse JSON
                var data = JSON.parse(body);
                // Use only result > html code
                var content = data.html.results;                
                // Parse html
                var $ = cheerio.load(content);
                // Iterate through offers & Extract information & Store in a Object
                $('.trip.relative').each(function() {
                    // Empty Object, has the same structure as the Db table
                    var json = {id: "", driver: "", rating: "", date: "", time: "", start: "", stops: "", end: "", price: "", url: "", query: ""};
                    // Assigning values
                    json.driver = $(this).find('.username').text();
                        ...  
                    // Save filled object in Db
                    save(json, callback);
                });         
            }
        });
  }, function(err){ 
        if (err) {
            console.log('could not save');
        } else {
            console.log('lets end connection');
            con.end(function(err) {if (err) throw err;});
        }
  }
);

function save(item, callback) {
   con.query('INSERT INTO offers SET ?', item, callback); 
}

问题是,数据库连接在任何东西可以存储到数据库之前就结束了。 con.end() 总是在实际查询之前或查询完成之前触发。我的意思是保存函数在完成后必须返回一些东西。如果我在没有con.end() 的情况下运行脚本,数据将完美地存储到数据库中。 我是 Node 新手,所以我还在学习,希望您能帮助我。

编辑: 我现在得到一个:

ReferenceError: callback is not defined
    at save (/home/juki/crawler/crawler.js:143:46)

还有一个:

Error: Callback was already called.
    at Query._callback (/home/juki/crawler/node_modules/async/dist/async.js:839:                                                                                                                     36)

【问题讨论】:

    标签: mysql node.js asynchronous request each


    【解决方案1】:

    您似乎没有从您的爬虫调用callback

    您似乎也没有等待保存完成。尝试返工save函数,所以它也需要回调。比如:

    function save(item, callback) {
        con.query('INSERT INTO offers SET ?', item, callback); 
    }
    

    然后这样称呼它:

    save(json, callback);
    

    其中callback 是您从async.each 获得的那个。

    【讨论】:

    • 感谢您的回复。那么我必须在哪里放置save(json, callback)?我必须在哪里从爬虫回调?
    • 将当前示例中的 save(json) 替换为 save(json, callback)。那应该这样做。另请查看github.com/caolan/async#eachcoll-iteratee-callback 上的async.each 文档 - 他们的文件保存示例与您的情况非常相似(您只需保存到数据库而不是直接保存到某个文件)。
    • 不幸的是,这只适用于async.each 的第一次迭代。之后我收到Error: Callback was already called. 有什么想法吗?
    • 请更新您的代码,以便我们查看问题所在。
    • 代码已更新。如您所见,来自save()callback 未定义,我收到一个错误,指出callback 已在async.each 上调用。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2016-10-04
    • 2017-06-20
    • 2022-06-17
    相关资源
    最近更新 更多