我有MySQL,Express,Angular,NodeJS应用程序,有时当我登录时,我的节点控制台出现以下错误:
TypeError:无法读取未定义
的属性'query'
错误发生在我的passport.local.js
文件中,这是一行:
connection.query('SELECT * FROM users WHERE username LIKE ?', [username], function (err, user) {
这是护照功能
passport.use(new LocalStrategy(
function(username, password, done) {
console.log('app.js');
pool.getConnection(function(err, connection) {
console.log('err: ' + err);
console.log(connection);
connection.query('SELECT * FROM users WHERE username LIKE ?', [username], function (err, user) {
if (err) throw err;
for (var i = user.length - 1; i >= 0; i--) {
var current = user[i];
}
if(current){
if(bcrypt.compareSync(password, current.password)){
return done(null, user);
} else {
return done(null, false);
}
} else {
console.log('no user');
return done(null, false);
}
});
connection.release();
});
}
));
我在文件顶部需要pool
var pool = require('../../config/connection');
发生错误时:
console.log(connection);
获取:
未定义
我也记录错误:
console.log('err: ' + err);
显示:
err: Error: ER_USER_LIMIT_REACHED: User 'bfe4a8980ede74' has exceeded the 'max_user_connections' resource (current value: 10)
答案 0 :(得分:3)
您收到的错误是说明问题:您的MySQL服务器只允许每个用户连接10个,并且已达到该限制。
default for the mysql
connection pool也恰好是10,这真的很接近。如果Express应用程序以外的任何其他MySQL客户端使用相同的用户凭据连接到数据库,则可能会遇到该特定错误。我建议在MySQL配置中增加max_user_connections
。
除此之外,您的代码还有另一个问题:它在查询完成之前释放连接,这可能会导致意外行为。将呼叫移至connection.release()
以进入回调:
pool.getConnection(function(err, connection) {
...
connection.query('SELECT * FROM users WHERE username LIKE ?', [username], function (err, user) {
connection.release();
...
});
});
如果这是您使用MySQL的常用方式(获取连接,执行查询,释放连接),则可以使用pool.query()
来简化生活。请参阅this example。
最后,如果您正在使用异步代码,请不要抛出错误,而是将它们传递给回调(并确保您实际处理它们,因为您没有处理来自pool.getConnection
的任何错误现在,除了记录它们之外):
pool.getConnection(function(err, connection) {
if (err) return done(err);
...
});
答案 1 :(得分:3)
我假设您的max_user_connections
设置为10.请提高max_user_connection
值。
show global variables like '%connections%';
将帮助您提供已设置的连接数。增加连接数如果它少于25或50.我猜最大连接数可能超过16000,这一切都取决于你的cpu,没有线程它可以处理等。
SET GLOBAL max_user_connections=100;
max_user_connections
是一个动态变量,这意味着您可以直接运行此查询。你不必关闭mysql。