我使用express作为节点的web服务器,一切似乎都工作正常。我遇到的唯一问题是当我重复加载特定页面("/学习"路线)10次时。一旦我这样做,express似乎停止工作,尽管没有错误记录到控制台,页面上也没有显示任何错误。它只是在浏览器中等待主机。奇怪的是,如果我从有问题的页面转到另一个页面,然后再转回来,问题不会发生。我可以想重复多少遍就重复多少遍,不会出错。下面是我遇到问题的路线:
var bcrypt = require('bcrypt');
var pool = require('../database.js').pool;
module.exports = function(app) {
app.get('/learn', function(req, res, next) {
var query = 'SELECT * FROM questions INNER JOIN answers ON questions.questionID = answers.questionID';
pool.getConnection(function(err, connection) {
connection.query(query, function(err, rows) {
if (err) {
throw err;
}
var data = {
name: req.session.name,
problems: rows,
};
res.render('learn.html', data);
});
});
});
app.post('/learn/checkAnswer', function(req, res) {
//get posted form data
var questionID = req.body.questionID;
var selectedAnswer = req.body.selectedAnswer;
//query database
pool.getConnection(function(err, connection) {
var query = connection.query('SELECT correctAnswer FROM questions WHERE questionID = ?', questionID, function(err, rows) {
res.send({
correctAnswer: rows[0].correctAnswer
});
});
});
});
};
我不确定这是否有区别,但我使用车把作为我的渲染引擎而不是jade,以及node-mysql作为我的数据库。
10为node-mysql
池的默认大小。由于您没有结束使用pool.getConnection
检索的连接,因此第11个请求将无限期地等待一个空闲连接。
易于修复:
connection.query(query, function(err, rows) {
connection.end(); // end the connection as soon as possible,
// so it's returned to the pool and can be reused.
if (err) ...
});