Nodejs MySQL连接超时

3
当我运行该应用程序时,它会显示:数据库已连接! 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;

你能在你的user.js文件中发布更多代码吗?最好包括你的require语句。 - Corey Berigan
是的!现在检查它。 - user3020640
我认为它是第一次连接...当我加载应用程序时...但是当我尝试通过选择查询登录时,连接变量为空...所以我创建了一个db对象然后调用connect函数.....我的connectdb函数被调用,但是函数内的db.connect()没有显示任何结果..例如(“连接数据库错误”或“数据库已连接!”) - user3020640
我已经发布了一个答案。如果这对你有用,或者你有其他问题,请告诉我。 - Corey Berigan
1个回答

2

Node.js 的本质是异步的。您正在尝试以同步方式使用它。要使其工作,您必须使用回调模式。以下是一个示例:

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 函数如何接受一个回调函数。当数据库连接成功后,代码将执行该回调函数以发送结果。在 user.js 文件中,现在可以传递回调函数并使用它给您的结果(db)。您可以在这里找到更多关于 Node.js 异步性质的信息here。基本上,异步代码使用回调函数,同步代码使用 return 语句。从异步函数返回值通常会产生空值结果,因为异步回调总是会在函数调用之后的“某个时候”触发。

类型错误:回调不是一个函数。 - user3020640
那意味着你传递的callback不是一个函数。你知道这个错误是从哪里来的吗?我发布的代码似乎没有任何错误。 - Corey Berigan
我对NodeJS还很陌生,但当我尝试在connect()后调用回调函数时,很明显我没有任何回调函数,这就是为什么它会显示错误的原因。另外,请告诉我是否有任何登录系统的示例。 - user3020640
当您调用dbcon.connectdb(function(err, dbconn){ ...时,function是在db.js中引用的callback,该行代码为exports.connectdb = function (callback) {。因此,callback是一个函数,并且在示例中被正确使用。您能否更新您的代码示例并提供您所拥有的内容? - Corey Berigan
在您上面发布的user.js中,您仍然没有更改代码。在您的示例中,您有var dbconn = dbcon.connectdb();而在我的示例中,我有dbcon.connectdb(function(err, dbconn){ ...。您需要使用我的示例更新您的代码。 - Corey Berigan
让我们在聊天室里继续这个讨论 - user3020640

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接