2017-12-27 40 views
0

mariadb 인스턴스에 연결하는 PCF에 nodejs 어플리케이션이 있습니다. 인스턴스 wait_timeout은 600이므로 비활성 후 10 분 후에 연결이 끊어집니다.Nodejs Mariadb on PCF timeout이 mariadb 이벤트를 트리거하지 않음

내 로컬 컴퓨터에서이 응용 프로그램을 실행하고 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; 

로드 서버 라우터

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 
,536 멀리 간

헤더가 이미 전송되었습니다. 그것들은 또한 이상하게 보이는 순서가 어긋난 것처럼 보인다. 이 테스트 중에 나는 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 

편집 :이 응용 프로그램의 구조는 자신감

내가 knex 드라이버 만 mariasql NPM 드라이버로 전환
+0

'일부 물건을 선택하십시오'가 10 분 이상 걸릴 수 있습니까? 이 진위 여부를 결정하는 진술을 분리하십시오. 느린 경우 나머지 부분 (PDF, 헤더, ERR 등)이 아닌 해당 항목에 집중합시다. –

+0

셀렉션이 1 행 또는 최대 1000 개만 선택되었습니다. 쿼리가 빠르게 실행되었지만이를 해결할 수 없습니다. . 내 "응답"을 참조하십시오. 운전사를 바꿔 줘야했습니다. – tiggles

답변

0

에 의해 생성되었습니다. knex 의존도가 mariasql: '^0.2.3'이라도 문제없이 바로 작동했습니다.