最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

关于PCF超时的Nodejs Mariadb不会触发mariadb事件

IT培训 admin 7浏览 0评论

关于PCF超时的Nodejs Mariadb不会触发mariadb事件

我在PCF上有一个连接到mariadb实例的nodejs应用程序。实例wait_timeout是600,因此在不活动后它会在10分钟后断开连接。

在运行此应用程序并连接到docker上的本地mariadb实例的本地计算机上(一旦超时命中或我终止连接),我将得到一个MySQL Server has gone away然后我的应用程序将重新连接并给我数据库结果。它不会在本地崩溃。

在PCF上运行时,mariadb错误会使应用程序崩溃,或者如果异常被捕获,它将崩溃并发送一个Headers already sent error

我相信一旦MariaDB以某种方式杀死了连接,即使我在连接上有事件处理程序,节点中的mariadb驱动程序也不会被通知连接已终止。因此,一旦我的应用程序尝试运行查询,它就会失败,因为事件未被触发并且它试图在已关闭的连接上运行它。

我的连接模块

// Loading local .env vars
var route_helper = require("./route_helper");

route_helper.loadLocalEnvVars();

var Client = require('mariasql');
var moment = require('moment');

var connection = null;
try{
    connection = new Client({
    host: process.env.DB_MARIA_HOST,
    user: process.env.DB_MARIA_USER,
    password: process.env.DB_MARIA_PASS,
    db: process.env.DB_MARIA_SCHEMA,
    port: parseInt(process.env.DB_MARIA_PORT),
    connTimeout: 20,
    pingInterval: 1,
    compress: true
  });

  connection.connect(function(err){
      if(!err) {
          if(process.env.DEBUG == "true"){
            console.log("Database is connected");
          }
      } else {
          console.log("Error connecting database " + err.message);  
          console.log(err);
      }
  });

  connection.on('ready',function(){
    if(process.env.DEBUG == "true"){
         console.log("Connection ready " + moment().format('MMMM Do YYYY, h:mm:ss a') )
    }
  });

  connection.on('close',function(){
    if(process.env.DEBUG == "true"){
         console.log("Connection closed " + moment().format('MMMM Do YYYY, h:mm:ss a') )
    }
  });
  connection.on('error',function(err){
    if(process.env.DEBUG == "true"){
         console.log("Connection timeout... Reconnecting")
         console.log(err);
    }
    if(err.code == 2006 ){
      this.connect();
    }
    //this.connect();
  });

}catch(err){
  console.log("Maria_db error")
  console.log(err)
  throw err;
}

module.exports = connection;

加载Server路由器

var routes = require("./routes/application.js").appRouter(server);

var server = server.listen(process.env.PORT, function () {
    console.log("Listening on port %s...", server.address().port);
});

我的路线

app.get("/applications", function (req, res) {
        try{
            var applications;       
            var dbConn = require("../util/db.js");

            dbConn.query('SELECT some stuff’, function (error, results) {
                if(!error) {
                    applications = {
                        "apps": results
                    }
                    return res.send(applications);
                } else {
                    return res.send({"status": "error", "message": error.code});
                }
            });
        }catch(err) {
            console.log(err)
        }
    });

MySql已经消失了

2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client.<anonymous> (/home/vcap/app/util/dbHealth.js:14:9)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at emitOne (events.js:101:20)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client.emit (events.js:191:7)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client._onerror (/home/vcap/app/node_modules/mariasql/lib/Client.js:395:10)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at process._tickCallback (internal/process/next_tick.js:104:9)
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! Exit status 1
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! Failed at the [email protected] start script 'node server.js'.
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! not with npm itself.
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! You can get information on how to open an issue for this project with:
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR!     npm bugs myapplication
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! Or if that isn't available, you can get their info via:
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR!     npm owner ls myapplication
   2017-12-20T09:03:55.33-0500 [APP/PROC/WEB/0] ERR npm ERR! Please include the following file with any support request:
   2017-12-20T09:03:55.33-0500 [APP/PROC/WEB/0] ERR npm ERR!     /home/vcap/app/.npm/_logs/2017-12-20T14_03_55_316Z-debug.log

标题已发送错误。它们似乎也是乱序的,这很奇怪。在此测试期间,我向3个不同的服务发送3个http请求并收到此错误。

   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at _combinedTickCallback (internal/process/next_tick.js:131:7)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at process._tickCallback (internal/process/next_tick.js:180:9) code: 2006 }
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR _http_outgoing.js:494
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at validateHeader (_http_outgoing.js:494:11)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.send (/home/vcap/app/node_modules/express/lib/response.js:158:21)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at Object.cb (/home/vcap/app/routes/application.js:474:29)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at _combinedTickCallback (internal/process/next_tick.js:131:7)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at process._tickCallback (internal/process/next_tick.js:180:9) code: 2006 }
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     throw new Error('Can\'t set headers after they are sent.');
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR Error: Can't set headers after they are sent.
   2017-12-27T11:07:46.41-0500 [APP/PROC/WEB/0] OUT Connection timeout... Reconnecting
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at _combinedTickCallback (internal/process/next_tick.js:131:7)
   2017-12-27T11:07:46.41-0500 [APP/PROC/WEB/0] OUT Route: /applications
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.setHeader (_http_outgoing.js:501:3)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.header (/home/vcap/app/node_modules/express/lib/response.js:767:10)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at process._tickCallback (internal/process/next_tick.js:180:9) code: 2006 }
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     ^
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.send (/home/vcap/app/node_modules/express/lib/response.js:170:12)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.json (/home/vcap/app/node_modules/express/lib/response.js:267:15)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at cleanupReqs (/home/vcap/app/node_modules/mariasql/lib/Client.js:744:11)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at Client._onclose (/home/vcap/app/node_modules/mariasql/lib/Client.js:574:5)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at Client._onerror (/home/vcap/app/node_modules/mariasql/lib/Client.js:396:10)
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! Failed at the [email protected] start script.
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR npm ERR! code ELIFECYCLE
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! 
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! [email protected] start: `node server.js`
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! Exit status 1
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! errno 1
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! A complete log of this run can be found in:
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR!     /home/vcap/app/.npm/_logs/2017-12-27T16_07_46_432Z-debug.log

编辑:此应用程序结构由swagger生成

回答如下:

我只从mariasql npm驱动程序切换到knex驱动程序。即使knex依赖有mariasql: '^0.2.3'它开箱即用,没有任何问题。

关于PCF超时的Nodejs Mariadb不会触发mariadb事件

我在PCF上有一个连接到mariadb实例的nodejs应用程序。实例wait_timeout是600,因此在不活动后它会在10分钟后断开连接。

在运行此应用程序并连接到docker上的本地mariadb实例的本地计算机上(一旦超时命中或我终止连接),我将得到一个MySQL Server has gone away然后我的应用程序将重新连接并给我数据库结果。它不会在本地崩溃。

在PCF上运行时,mariadb错误会使应用程序崩溃,或者如果异常被捕获,它将崩溃并发送一个Headers already sent error

我相信一旦MariaDB以某种方式杀死了连接,即使我在连接上有事件处理程序,节点中的mariadb驱动程序也不会被通知连接已终止。因此,一旦我的应用程序尝试运行查询,它就会失败,因为事件未被触发并且它试图在已关闭的连接上运行它。

我的连接模块

// Loading local .env vars
var route_helper = require("./route_helper");

route_helper.loadLocalEnvVars();

var Client = require('mariasql');
var moment = require('moment');

var connection = null;
try{
    connection = new Client({
    host: process.env.DB_MARIA_HOST,
    user: process.env.DB_MARIA_USER,
    password: process.env.DB_MARIA_PASS,
    db: process.env.DB_MARIA_SCHEMA,
    port: parseInt(process.env.DB_MARIA_PORT),
    connTimeout: 20,
    pingInterval: 1,
    compress: true
  });

  connection.connect(function(err){
      if(!err) {
          if(process.env.DEBUG == "true"){
            console.log("Database is connected");
          }
      } else {
          console.log("Error connecting database " + err.message);  
          console.log(err);
      }
  });

  connection.on('ready',function(){
    if(process.env.DEBUG == "true"){
         console.log("Connection ready " + moment().format('MMMM Do YYYY, h:mm:ss a') )
    }
  });

  connection.on('close',function(){
    if(process.env.DEBUG == "true"){
         console.log("Connection closed " + moment().format('MMMM Do YYYY, h:mm:ss a') )
    }
  });
  connection.on('error',function(err){
    if(process.env.DEBUG == "true"){
         console.log("Connection timeout... Reconnecting")
         console.log(err);
    }
    if(err.code == 2006 ){
      this.connect();
    }
    //this.connect();
  });

}catch(err){
  console.log("Maria_db error")
  console.log(err)
  throw err;
}

module.exports = connection;

加载Server路由器

var routes = require("./routes/application.js").appRouter(server);

var server = server.listen(process.env.PORT, function () {
    console.log("Listening on port %s...", server.address().port);
});

我的路线

app.get("/applications", function (req, res) {
        try{
            var applications;       
            var dbConn = require("../util/db.js");

            dbConn.query('SELECT some stuff’, function (error, results) {
                if(!error) {
                    applications = {
                        "apps": results
                    }
                    return res.send(applications);
                } else {
                    return res.send({"status": "error", "message": error.code});
                }
            });
        }catch(err) {
            console.log(err)
        }
    });

MySql已经消失了

2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client.<anonymous> (/home/vcap/app/util/dbHealth.js:14:9)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at emitOne (events.js:101:20)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client.emit (events.js:191:7)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client._onerror (/home/vcap/app/node_modules/mariasql/lib/Client.js:395:10)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-20T09:03:55.29-0500 [APP/PROC/WEB/0] ERR     at process._tickCallback (internal/process/next_tick.js:104:9)
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! Exit status 1
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! Failed at the [email protected] start script 'node server.js'.
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! not with npm itself.
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! You can get information on how to open an issue for this project with:
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR!     npm bugs myapplication
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR! Or if that isn't available, you can get their info via:
   2017-12-20T09:03:55.31-0500 [APP/PROC/WEB/0] ERR npm ERR!     npm owner ls myapplication
   2017-12-20T09:03:55.33-0500 [APP/PROC/WEB/0] ERR npm ERR! Please include the following file with any support request:
   2017-12-20T09:03:55.33-0500 [APP/PROC/WEB/0] ERR npm ERR!     /home/vcap/app/.npm/_logs/2017-12-20T14_03_55_316Z-debug.log

标题已发送错误。它们似乎也是乱序的,这很奇怪。在此测试期间,我向3个不同的服务发送3个http请求并收到此错误。

   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at _combinedTickCallback (internal/process/next_tick.js:131:7)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at process._tickCallback (internal/process/next_tick.js:180:9) code: 2006 }
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR _http_outgoing.js:494
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at validateHeader (_http_outgoing.js:494:11)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.send (/home/vcap/app/node_modules/express/lib/response.js:158:21)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at Object.cb (/home/vcap/app/routes/application.js:474:29)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at _combinedTickCallback (internal/process/next_tick.js:131:7)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at process._tickCallback (internal/process/next_tick.js:180:9) code: 2006 }
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     throw new Error('Can\'t set headers after they are sent.');
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR Error: Can't set headers after they are sent.
   2017-12-27T11:07:46.41-0500 [APP/PROC/WEB/0] OUT Connection timeout... Reconnecting
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at _combinedTickCallback (internal/process/next_tick.js:131:7)
   2017-12-27T11:07:46.41-0500 [APP/PROC/WEB/0] OUT Route: /applications
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT { Error: MySQL server has gone away
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at Client._processQueue (/home/vcap/app/node_modules/mariasql/lib/Client.js:614:18)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.setHeader (_http_outgoing.js:501:3)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.header (/home/vcap/app/node_modules/express/lib/response.js:767:10)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at process._tickCallback (internal/process/next_tick.js:180:9) code: 2006 }
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] OUT     at /home/vcap/app/node_modules/mariasql/lib/Client.js:223:12
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     ^
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.send (/home/vcap/app/node_modules/express/lib/response.js:170:12)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at ServerResponse.json (/home/vcap/app/node_modules/express/lib/response.js:267:15)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at cleanupReqs (/home/vcap/app/node_modules/mariasql/lib/Client.js:744:11)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at Client._onclose (/home/vcap/app/node_modules/mariasql/lib/Client.js:574:5)
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR     at Client._onerror (/home/vcap/app/node_modules/mariasql/lib/Client.js:396:10)
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! Failed at the [email protected] start script.
   2017-12-27T11:07:46.42-0500 [APP/PROC/WEB/0] ERR npm ERR! code ELIFECYCLE
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! 
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! [email protected] start: `node server.js`
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! Exit status 1
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! errno 1
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR! A complete log of this run can be found in:
   2017-12-27T11:07:46.43-0500 [APP/PROC/WEB/0] ERR npm ERR!     /home/vcap/app/.npm/_logs/2017-12-27T16_07_46_432Z-debug.log

编辑:此应用程序结构由swagger生成

回答如下:

我只从mariasql npm驱动程序切换到knex驱动程序。即使knex依赖有mariasql: '^0.2.3'它开箱即用,没有任何问题。

发布评论

评论列表 (0)

  1. 暂无评论