【问题标题】:Node MySQL error - Error: Cannot enqueue Quit after invoking quit节点 MySQL 错误 - 错误:调用退出后无法排队退出
【发布时间】:2018-01-19 03:34:30
【问题描述】:

我正在创建一个基于 Promise 的 API。如果我一次发出一个请求,一切正常,但是,如果 2 个或更多请求在一秒钟内到达服务器,我会收到以下错误

Error: Cannot enqueue Quit after invoking quit

奇怪的是,我得到了返回给 API 请求的有效且正确的结果,但是,显然有问题。

我在 gitHub 上创建了一个 small project。您可以查看一下,我创建了一个有 2 个用户的 SQL 播种器,因此您可以将查询复制粘贴到您的数据库中(播种器甚至创建一个新数据库)

项目很小,只需将您的数据库凭据放在 configs/mysql.js 文件中,然后运行文件node multiple_sends.js

你会看到返回了正确的答案,但是节点吹错了。

我认为错误不在 mysql 模块中。原因是,如果我从模型中获取代码并创建 CLI 脚本,则不会返回任何错误,mysql 不会发出任何警告

// models/user.js
let mysql     = require('mysql');

let configs   = {
  host     : '127.0.0.1',
  user     : 'root',
  password : 'something',
  database : 'demo'
}

/**
 * This constructor function is responsible for running queries against
 * the mysql database
 */
function Users()
{
  // These are PRIVATE variables, they can only be accessed within this class
  let mysql_connection = null;

  this.getUserByEmail = function(email)
  {
    let parent = this;

    mysql_connection = mysql.createConnection(configs);

    return this.mysqlConnect()
      .then((connectionId) =>
      {
        console.log(`getUserByEmail: connection id: ${connectionId}`);

        let sql = 'SELECT user_id, first_name, last_name, upassword, email, '
          + 'birthday, roles FROM users WHERE email = ?';

        return parent.runQuery(sql, [email]);
      })
      .then((results) =>
      {
        if (results.resultSet.length === 0) {
          return null;
        }

        let resultSet = results.resultSet[0];

        // return our result to the calling method.
        return (resultSet);
      })
      .catch(error => {
        throw error;
      })
  }

  /**
   * Run this method when trying to connect to the database
   * @param Object error
   * @return Promise
   */
  this.mysqlConnect = function()
  {
    return new Promise(function(resolve, reject)
    {
      mysql_connection.connect(function(error)
      {
        if (error) {
          console.log('Error making connection', error);

          throw "Failed connection to database";
        }

        // we don't have to return anything, this is just to show that Promises
        // can return
        resolve(mysql_connection.threadId);
      });
    });
  }

  /**
   * use this method for running selects
   * @param string query - well formed query
   * @return Promise
   */
  this.runQuery = function(query, params)
  {
    return new Promise(function(resolve, reject)
    {
      mysql_connection.query(query, params, function(error, results, fields)
      {
        mysql_connection.end((err) => {
          if (err) {
            console.log('error terminating connection: ', mysql_connection.threadId);
            console.log('error ', err);
          }
        });

        if (error) {
          reject(error);
        }
        resolve({resultSet: results, fieldSet: fields});
      });

    });
  }
}

module.exports =  Users;

这里是调用模型的脚本

//main.js
let Users = require ('./models/user');

function getUser1Info()
{
  user1.getUserByEmail('original.logger@example.com')
    .then(userData1 => {
      let ctime = new Date();
      console.log(ctime.getTime(), 'user data: ', userData1.user_id)
    })
    .catch((error) => {
      console.log('error!', error);
    });
}


function getUser2Info()
{
  user2.getUserByEmail('billy.b.parker@example.com')
    .then(userData2 => {
      let ctime = new Date();
      console.log(ctime.getTime(), 'user data: ', userData2.user_id)
    })
    .catch((error) => {
      console.log('error!', error);
    });
}

let user1 = new Users();
let user2 = new Users();

setTimeout(() => {
  getUser1Info();
}, 1000);

setTimeout(() => {
  getUser2Info();
}, 999);

此代码未从我的 API 中的 models/user.js 修改。这让我相信我在 Express 中创建模型的方式已经彻底被破坏了。

感谢任何帮助

【问题讨论】:

  • 您找到解决方案了吗?
  • @KingAndrew 是的,我没有使用 MySQL 池。如果您查看 gitHub 链接 pool_user.jsbaseModel.js 将向您展示如何同时拥有多个连接。

标签: mysql node.js express exception


【解决方案1】:

如果您使用 node-mysql 模块,只需删除 .connect 和 .end。刚刚自己解决了这个问题。显然,他们在最后一次迭代中加入了不必要的代码,这也是错误的。如果您已经运行了 createConnection 调用,则不需要连接

Cannot enqueue Handshake after invoking quit

我也会做的:使用 Knex 而不是普通的 mysql

【讨论】:

  • 我不这么认为。我只是从我的模型中获取代码并创建了一个简单的脚本,它同时调用了模型两次。见上面的编辑。这应该模拟多个 HTTP 信息请求。代码的写法没有问题:.connect() -> query() -> end()
猜你喜欢
  • 2018-01-31
  • 2017-06-19
  • 2018-05-18
  • 2012-12-29
  • 1970-01-01
  • 2021-12-13
  • 2016-10-03
  • 2020-03-10
  • 2012-12-14
相关资源
最近更新 更多