首页 文章

错误:在已经将握手排队后无法将握手排入队列

提问于
浏览
0

我从不同的来源获取新闻源并添加到数据库但我得到以下异常

错误:在已经将握手排队后无法排队握手 . 在Protocol._enqueue上的Protocol._validateEnqueue(/home/vikas/node_modules/mysql/lib/protocol/Protocol.js:210:16)(/home/vikas/node_modules/mysql/lib/protocol/Protocol.js:139: 13)在Connection.connect上的Protocol.handshake(/home/vikas/node_modules/mysql/lib/protocol/Protocol.js:52:23)(/home/vikas/node_modules/mysql/lib/Connection.js:130: 18)在storeNewsFeedsInDB(/ home / vikas / NodeJS Practice / fetchNews.js:42:7)的newsapi.v2.everything.then.response(/ home / vikas / NodeJS Practice / fetchNews.js:33:9)at tryCatcher (/home/vikas/node_modules/bluebird/js/release/util.js:16:23)在Promise._settlePromiseFromHandler(/home/vikas/node_modules/bluebird/js/release/promise.js:512:31)的Promise Promise._settlePromise0上的._settlePromise(/home/vikas/node_modules/bluebird/js/release/promise.js:569:18)(/home/vikas/node_modules/bluebird/js/release/promise.js:614:10)在Asise._drainQueue的Promise._settlePromises(/home/vikas/node_modules/bluebird/js/release/promise.js:693:18)(/ home / vikas / node_module s / bluebird / js / release / async.js:133:16)在Very.Async.drainQueues的Async._drainQueues(/home/vikas/node_modules/bluebird/js/release/async.js:143:10) home / vikas / node_modules / bluebird / js / release / async.js:17:14)在tryOnImmediate的runCallback(timers.js:637:20)(timers.js:610:5)

以下是我的代码

const NewsAPI = require('newsapi');
const newsapi = new NewsAPI('*****************************');

var mysql = require('mysql');
var con = mysql.createConnection({
  host: "****",
  user: "****",
  password: "****",
  database: "****"
});

var channels = ['bbc-news', 'the-verge', 'reuters', 'cnbc', 'bloomberg', 'economist', 'nytimes'];
var topics = ['technology', 'business', 'finance', 'tech', 'economics', 'company'];

for (var i = 0; i < channels.length; i++) {
  for (var j = 0; j < topics.length; j++) {
    newsapi.v2.everything({
      q: topics[j],
      // q: 'technology',
      sources: channels[i],
      // sources: 'bloomberg',
      // domains: 'bbc.co.uk, techcrunch.com',
      from: '2018-03-14',
      to: '2018-03-14',
      language: 'en',
      sortBy: 'relevancy',
      pageSize:100,
      page: 1
    }).then(response => {
      // console.log(response);
      for (var i = 0; i < response.articles.length; i++) {
        // console.log(response.articles[i].title);
        storeNewsFeedsInDB(response.articles[i].title, 
                            response.articles[i].description, 
                              response.articles[i].url);
      }
    });
  }
}

function storeNewsFeedsInDB(title, description, url) {
  con.connect(function(err) {
    if (err) throw err;
    console.log("Connected!");

    //Insert a record in the "newsfeeds" table:
    var sql = "INSERT IGNORE INTO newsfeeds (`title`, `description`, `url`) VALUES ('" 
                + title.replace(/'/g, "\\'") + "', '" + description.replace(/'/g, "\\'") + "', '" + url + "')";
                console.log(sql);
    con.query(sql, function (err, result) {
      if (err) throw err;
      console.log("1 record inserted");
    });
  });
}

Nodejs和Mysql的新手,请帮帮我 .

1 回答

  • 1

    您正在从(嵌套)循环内部调用 storeNewsFeedsInDB ,并且每次访问它时都会调用 con.connect ,这就是为什么会出现"enqueued handshake"错误 . 看一下one of mysql npm package test suites可以揭示,因为一旦两次连续的 con.connect 调用就会抛出错误 .

    只需从代码中删除 con.connect 调用就可以了,因为任何 query 调用都会隐式 Build 连接,as the docs say .

相关问题