Nodejs MySQL连接超时

当我运行应用程序,它显示我Database is connected!

db.js

 var mysql = require('mysql'); var settings = require('./config'); var db; var exports = {}; exports.connectdb = function () { db = mysql.createConnection(settings.Database); db.connect(function(err){ console.log('connecting'); if(!err) { console.log('Database is connected!'); return db; } else { console.log('Error connecting database!'+err); return null; } }); }; module.exports = exports; 

但是当我试图从user.js连接数据库它显示我connection is null / TypeError: Cannot read property 'query' of undefined

来自user.js的代码块

 var exports = {}; var dbcon = require('../config/db.js'); var dbconn = dbcon.connectdb(); exports.login = function(email,password) { var userdetails = { name:email, password:password}; var dbconn = dbcon.connectdb(); if ( dbconn == null ) console.log('still nul'); dbconn.query("SELECT * FROM users where email = '"+email+"' and password = '"+password +"'", function (err, result) { if(err) { console.log(result[0]+' err'); return null; } }); }; module.exports = exports; 

Node.js本质上是asynchronous的。 您正试图以同步的方式使用它。 为了使这个工作,你必须使用callback模式。 下面是一个例子:

db.js

 var mysql = require('mysql'); var settings = require('./config'); var exports = {}; exports.connectdb = function (callback) { var db = mysql.createConnection(settings.Database); db.connect(function(err){ callback(err,db); }); }; module.exports = exports; 

user.js的

 var exports = {}; var dbcon = require('../config/db.js'); exports.login = function(email,password) { var userdetails = { name:email, password:password}; dbcon.connectdb(function(err, dbconn){ if ( err) //handle error dbconn.query("SELECT * FROM users where email = '"+email+"' and password = '"+password +"'", function (err, result) { if(err) { console.log(result[0]+' err'); } }); }); }; module.exports = exports; 

从上面的代码可以看到connectdb函数如何接受函数callback。 数据库连接后,代码将执行该callback来发送结果。 在user.js文件中,您现在可以传递一个callback函数并使用它给出的结果(db)。 你可以在这里find更多关于Node.jsasynchronous特性的信息 。 基本上,asynchronous代码使用callback和同步代码使用return语句。 从asynchronous函数返回值通常会产生空结果,因为调用函数后,asynchronouscallback将始终触发“某个时间段”。