node js mysql insert query使变量值undefined

时间:2015-11-17 11:26:34

标签: mysql node.js web-scraping

我有以下代码片段从网址中提取数据,将其显示给用户以及更新mysql数据库 - 除了一个小问题外,其工作正常:

function RunScrapingIndexWatch() {
    myhttp.get('http://www.url.com',
            function (_html) {
        if (_html && _html.length > 10) {
            news.indexwatch = [];
            $ = cheerio.load(_html);
            status = false;
                $('td.text21').each(function () {
                    status = true;
                    var price1 = parseFloat($(this).text().substr($(this).text().indexOf("Nifty :") + 7, 7).trim());
                    var abc = stringHelper.getIndiaTime();
                    var IWTime = abc.toLocaleTimeString();
                    news.indexwatch.push({
                        'price1': price1,
                        'IWTime': IWTime,
                        });


                var post = {
                        'price1': price1,
                        'IWTime': IWTime
                        };




            connection.query('INSERT INTO IW SET ?', post, function (err,result){
            if (err) 
            {console.log("IW sql insert error : " +price1 +IWTime);}
            else {
                console.log("IW data inserted : " +price1 +" | " +IWTime);
            }
        });



                });
                if (status) {

                io.emit('news', news);

            }
            if (timerIndexWatch) {
                clearTimeout(timerIndexWatch);
            }

            timerIndexWatch = setTimeout(RunScrapingIndexWatch, config.DelayExtractIndexWatch);                
        }
    });
}

问题在于,在网页显示中(由上面的代码" news.indexwatch.push"生成)短暂的瞬间,IWTime的值显示为未定义 - 我猜这发生在mysql连接查询正在运行。 mysql数据库正在正确更新。

有没有办法在io.emit新闻动作后运行mysql插入查询?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

除非您可以使用.emit()函数的回调,否则。

为什么不等待MySQL完成它的操作,方法是将.emit()放在connection.query()回调中:

function RunScrapingIndexWatch() {

  myhttp.get('http://www.url.com', function(_html) {

    if (_html && _html.length > 10) {
      news.indexwatch = [];
      $ = cheerio.load(_html);
      status = false;

      $('td.text21').each(function() {

        status = true;
        var price1 = parseFloat($(this).text().substr($(this).text().indexOf("Nifty :") + 7, 7).trim()),
          abc = stringHelper.getIndiaTime(),
          IWTime = abc.toLocaleTimeString(),
          post = {
            'price1': price1,
            'IWTime': IWTime
          };

        connection.query('INSERT INTO IW SET ?', post, function(err, result) {
          if (err) {
            console.log("IW sql insert error : " + price1 + IWTime);
          } else {
            console.log("IW data inserted : " + price1 + " | " + IWTime);
          }

          news.indexwatch.push(post);

          if (status) io.emit('news', news);

        }); // connection.query()

        if (timerIndexWatch) clearTimeout(timerIndexWatch);
        timerIndexWatch = setTimeout(RunScrapingIndexWatch, config.DelayExtractIndexWatch);

      }); // $.each()
    } // if (_html && ...)
  }); // myhttp.get()
}; // RunScrapingIndexWatch