2017-08-29 78 views
1

我用express和webpack做了我的服務,它在開始時運行良好。奇怪的是,一段時間後服務(服務器)將掛起。屏幕截圖顯示時,沒有收到消息代碼。 (server message screenshot) 而這種情況一再發生。NodeJS/express:服務器啓動後暫停運行一段時間

我app.js

var express = require('express'); 
 
var path = require('path'); 
 
var favicon = require('serve-favicon'); 
 
var logger = require('morgan'); 
 
var cookieParser = require('cookie-parser'); 
 
var bodyParser = require('body-parser'); 
 

 
var index = require('./routes/index'); 
 
var users = require('./routes/users'); 
 

 
var app = express(); 
 
var mysql = require('mysql'); 
 

 
var generals = require('./routes/generals'); 
 

 
// view engine setup 
 
app.set('views', path.join(__dirname, 'views')); 
 
app.set('view engine', 'jade'); 
 

 
app.use(logger('dev')); 
 
app.use(bodyParser.json()); 
 
app.use(bodyParser.urlencoded({ extended: false })); 
 
app.use(cookieParser()); 
 
app.use('/generals', generals); 
 
app.use(express.static(path.join(__dirname, 'public'))); 
 

 
app.use('/', index); 
 
app.use('/users', users); 
 

 
// catch 404 and forward to error handler 
 
app.use(function(req, res, next) { 
 
    var err = new Error('Not Found'); 
 
    err.status = 404; 
 
    next(err); 
 
}); 
 

 
// error handler 
 
app.use(function(err, req, res, next) { 
 
    // set locals, only providing error in development 
 
    res.locals.message = err.message; 
 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 
 

 
    // render the error page 
 
    res.status(err.status || 500); 
 
    res.render('error'); 
 
}); 
 

 
module.exports = app;

在這裏是路線文件:generals.js

var express = require('express'); 
 
var bodyParser = require('body-parser'); 
 

 
var router = express.Router(); 
 
var pool = require('./connections'); 
 

 
router.get('/dropDownValue/', function(req, res, next) { 
 
    pool.getConnection(function(err, connection) { 
 
     connection.query("select * from drop_down_value order by id desc", function(err, rows) { 
 
      if (!err && rows.length > 0) { 
 
       res.json(rows); 
 
      } else { 
 
       res.json([]); 
 
      } 
 
     }); 
 
    }); 
 
});
而連接文件:

var mysql = require('mysql'); 
 

 
var pool = mysql.createPool({ 
 
    host: 'xxx', 
 
    user: 'xxx', 
 
    password: 'xxx', 
 
    database: 'xxx' 
 
}); 
 

 
exports.getConnection = function (callback) { 
 
    pool.getConnection(callback); 
 
};

+0

在代碼中添加對未處理拒絕(對於承諾)和未捕獲異常(對於try catch)的支持,並告訴我們是否在服務器掛起時在日誌中看到新的東西 – Fefux

+0

304不是問題(它是Express你的瀏覽器,即文件的緩存版本仍然是最新的),這是對'/ generals/dropDownValue'的請求開始失敗。我們不知道爲什麼,因爲你沒有顯示它的代碼。而且,「池」不是全球性的,與評論所述相反。 – robertklep

+0

@robertklep我更新了代碼並刪除了全局池。 – Christine

回答

0

當您使用pool.getConnection(),一旦你與完成連接後(即查詢已完成),則需要重新釋放連接返回到池中:否則

pool.getConnection(function(err, connection) { 
    connection.query("select * from drop_down_value order by id desc", function(err, rows) { 

     connection.release(); // <- this 

     if (!err && rows.length > 0) { 
      res.json(rows); 
     } else { 
      res.json([]); 
     } 
    }); 
}); 

,一旦你已經執行10個查詢,也有在池中不可沒有更多的連接,它就會開始等待(無限期)連接被釋放,掛起請求。

+0

謝謝!幫助很多!請記住。 – Christine

相關問題