Javascript 节点js+;Mysql:由于致命错误,无法排队

Javascript 节点js+;Mysql:由于致命错误,无法排队,javascript,mysql,node.js,express,server,Javascript,Mysql,Node.js,Express,Server,我正在使用NodeJS(更具体地说是ExpressJS)运行一个应用程序,并使用mysql客户端保存一些数据 它完美地工作了一段时间,没有任何问题,但后来所有的suddden我都犯了以下错误: 跟踪:出现致命错误后无法将退出排队。 at Protocol.\u validateEnqueue(C:\nodejs\deceond coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:218:11) at Protocol.\u排队(C:\no

我正在使用NodeJS(更具体地说是ExpressJS)运行一个应用程序,并使用mysql客户端保存一些数据

它完美地工作了一段时间,没有任何问题,但后来所有的suddden我都犯了以下错误:

跟踪:出现致命错误后无法将退出排队。 at Protocol.\u validateEnqueue(C:\nodejs\deceond coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:218:11) at Protocol.\u排队(C:\nodejs\seven coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:135:13) 在Protocol.quit(C:\nodejs\seven coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:88:23) 在PoolConnection.end(C:\nodejs\seven coiffure\node\u modules\mysql\lib\Connection.js:255:18) 在Pool.\u purgeConnection(C:\nodejs\seven coiffure\node\u modules\mysql\lib\Pool.js:259:16) 在PoolConnection上。\u从池中移除(C:\nodejs\seeden coiffure\node\u modules\mysql\lib\PoolConnection.js:70:8) 在PoolConnection上。(C:\nodejs\seven coiffure\node\u modules\mysql\lib\PoolConnection.js:29:12) 在emitOne(events.js:77:13) 在PoolConnection.emit上(events.js:169:7) 在PoolConnection.Connection.\u handleprotocolorr(C:\nodejs\seven coiffure\node\u modules\mysql\lib\Connection.js:439:8) 跟踪:出现致命错误后无法将查询排队。 at Protocol.\u validateEnqueue(C:\nodejs\deceond coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:218:11) at Protocol.\u排队(C:\nodejs\seven coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:135:13) 在PoolConnection.query上(C:\nodejs\seeden coiffure\node\u modules\mysql\lib\Connection.js:214:25) 在Object.fetchDatas(C:\nodejs\seven-coiffure\public\javascripts\twevelbase.js:94:12) 在C:\nodejs\seven coiffure\routes\index.js:7:7 在Layer.handle[作为handle\u请求](C:\nodejs\seven coiffure\node\u modules\express\lib\router\Layer.js:95:5) 在下一个(C:\nodejs\seven coiffure\node\u modules\express\lib\router\route.js:131:13) 在Route.dispatch(C:\nodejs\seeden coiffure\node\u modules\express\lib\router\Route.js:112:3) 在Layer.handle[作为handle\u请求](C:\nodejs\seven coiffure\node\u modules\express\lib\router\Layer.js:95:5) 在C:\nodejs\seven coiffure\node\u modules\express\lib\router\index.js:277:22 C:\nodejs\seven coiffure\public\javascripts\twevebase.js:26 抛出(消息); ^

错误:出现致命错误后,无法将查询排队。 at Protocol.\u validateEnqueue(C:\nodejs\deceond coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:199:16) at Protocol.\u排队(C:\nodejs\seven coiffure\node\u modules\mysql\lib\Protocol\Protocol.js:135:13) 在PoolConnection.query上(C:\nodejs\seeden coiffure\node\u modules\mysql\lib\Connection.js:214:25) 在Object.fetchDatas(C:\nodejs\seven-coiffure\public\javascripts\twevelbase.js:94:12) 在C:\nodejs\seven coiffure\routes\index.js:7:7 在Layer.handle[作为handle\u请求](C:\nodejs\seven coiffure\node\u modules\express\lib\router\Layer.js:95:5) 在下一个(C:\nodejs\seven coiffure\node\u modules\express\lib\router\route.js:131:13) 在Route.dispatch(C:\nodejs\seeden coiffure\node\u modules\express\lib\router\Route.js:112:3) 在Layer.handle[作为handle\u请求](C:\nodejs\seven coiffure\node\u modules\express\lib\router\Layer.js:95:5) 在C:\nodejs\seven coiffure\node\u modules\express\lib\router\index.js:277:22

问题是,我真的无法在我的代码中找到问题的来源,我甚至不知道为什么有时在工作,有时不工作

以下是启动数据库的代码:

var mysql = require('mysql');
var dbPool = mysql.createPool({
 connectionLimit: 50,
 waitForConnections: true,
 queueLimit: 0,
 host: '*my host*',
 user: '*me*',
 password: '*my password*',
 database: '*heroku database*',
 wait_timeout:28800,
 connect_timeout:10,
 debug:true
});

dbPool.getConnection(function(err, connection) {
 if (err) throw (err);

 var db = connection;

 fetchDatas = function(callback) {

    // openDatabase();

    var servicesFemmes, servicesHommes, products;

    db.query("SELECT * FROM servicesFemmes", function(err, servicesFemmes, fields) {

        if (err) {
            callback(sendError(err));
        } else {

            db.query("SELECT * FROM servicesHommes", function(err, servicesHommes, fields) {
                if (err) {
                    callback(sendError(err));
                } else {
                    db.query("SELECT * FROM produits", function(err, products, fields) {
                        if (err) {
                            callback(sendError(err));
                        } else {
                            db.query("SELECT * FROM carousel", function(err, carousel, fields) {
                                if (err) {
                                    callback(sendError(err));
                                } else {
                                    callback(null, servicesFemmes, servicesHommes, products, carousel);
                                }
                            });
                        }
                    });
                }
            });
        }
    });
}
}
}

当然,我正在从另一个文件调用fetchDatas(),以获取要显示的所有数据。

最后,我放弃了纯MYSQL,开始使用Sequelize。以下是我的代码(最终有效):

然后,在前面代码段的最后一行导出了另一个调用函数“synchronize”的文件(“exports.synchronize=synchronizeBdd”):


对我来说,我之所以出现这个错误,仅仅是因为MySql服务器没有运行,所以最好检查一下

您可能想使用这里提供的promise库,因为它已经在“回调地狱”中。您是否释放连接以便池可以再次使用它?+db对象来自哪里?这不应该是连接对象吗?好的@tadman,如果我在这里找不到解决方案,我可能很快就会使用它。我只是想保持简单(我从sqlite3开始,但它与heroku主机不兼容)因为它只是一个小商店的简单页面。@Johannes Merz我确实为我使用的所有其他sql函数发布了连接,但有一条消息说连接已经发布,所以我发现它已经在其他地方完成了(找不到确切的位置)。对于db对象是的,很抱歉,我要编辑这篇文章:我错过了“var db=connection”@tadman一行,我终于接受了你的建议,使用了Sequelize。这很完美,解决了我的问题。谢谢你别忘了你可以像这里一样清理代码。这对于并行运行多个承诺并使用它们的组合结果非常有用。
var mysql = require('mysql');
var Sequelize = require('sequelize');

var sequelize = new Sequelize('database name', 'username', 'password', {
host: 'your host url',
dialect: 'mysql',

pool: {
    max: 10,
    min: 0,
    idle: 3000
}
});


//Models' creation
var servicesHommes = sequelize.define('servicesHommes', {
 nom: {
     type: Sequelize.STRING,
     field: 'nom'
 },
 cheveuxLongs: {
     type: Sequelize.STRING,
     field: 'cheveuxLongs'
 },
 cheveuxCourts: {
     type: Sequelize.STRING,
     field: 'cheveuxCourts'
 }
}, {
 freezeTableName: true
});

var servicesFemmes = sequelize.define('servicesFemmes', {
nom: {
    type: Sequelize.STRING,
    field: 'nom'
},
cheveuxLongs: {
    type: Sequelize.STRING,
    field: 'cheveuxLongs'
},
cheveuxCourts: {
    type: Sequelize.STRING,
    field: 'cheveuxCourts'
}
}, {
freezeTableName: true
});

var carousel = sequelize.define('carousel', {
 photo: {
     type: Sequelize.STRING,
     field: 'photo'
 }
});

var produits = sequelize.define('produits', {
  marque: {
     type: Sequelize.STRING,
     field: 'marque'
  },
  nom: {
    type: Sequelize.STRING,
    field: 'nom'
  },
  photo: {
    type: Sequelize.STRING,
    field: 'photo'
  }
}, {
freezeTableName: true
});

synchronizeBdd = function(callback) {

sequelize.sync().then(function() {
//any function querying the database should be placed here in this callback


    fetchDatas = function(callback) {

        servicesFemmes.findAll().then(function(femmes) {
            servicesHommes.findAll().then(function(hommes) {
                produits.findAll().then(function(products) {
                    carousel.findAll().then(function(carousels) {
                        callback(null, femmes, hommes, products, carousels);
                    })
                })
            })
        });
    }

    //end of sync()
    exports.fetchDatas = fetchDatas;
    callback();
});
}

exports.synchronize = synchronizeBdd;
var bdd = require('fileWithSequelizeInstantiation')

bdd.synchronize(function() {
 //here I call the functions related to my database. In my case: bdd.fetchDatas()
})