2017-08-29 264 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

相关问题