Nodejs generic-pool操作mysql的问题 如何取出最终的结果?

Nodejs generic-pool操作mysql的问题 如何取出最终的结果?

这是gamerService中的一段代码, 然后我想在routes中调用这个代码,

 exports.authenticateGamer = function(username, password){
        q.pool.acquire(function(err,client){
            if(err){}
            else{
                client.query("SELECT * FROM gamer WHERE username = ?, password = ? "
                    ,[username,password], function(err,data){
                    q.pool.release(client);
                });
            }
        });
    }


app.post("/login",routes.login)代码如下:
exports.login = function(req,res){
    var gamerName = req.body.loginUser;
    var password = req.body.loginPwd;

    var temp = gamerService.authenticateGamer(gamerName,password);
    console.log(temp);
}

但是我肯定我的输入是没有错的, 而temp却始终不能得观察家我想要的结果而一直是undefined.

问题延伸: 我如何将exports.login得到的值返回到前台的js上, 当temp是空的时候让前台的js弹出一个alert? 并附前台js代码:

$(document).ready(function(){
    $('#registerBtn').click(function(){
        if(!$('#reg-name').val()){
            alert("Username can't be empty!");
            return false;
        }
        if($('#reg-pwd').val()!=$('#reg-cpwd').val()||!$('#reg-pwd').val()){
            alert("Passwords are different or empty!");
            return false;
        };
    });
});

感恩!


4 回复

要解决你遇到的问题,需要确保 authenticateGamer 函数能够正确地处理异步操作,并将查询结果传递给调用者。同时,你需要在 login 函数中正确处理这些异步操作。

解决方法

  1. 使用Promise封装 authenticateGamer 函数:这样可以在调用该函数时等待结果。
  2. login 函数中处理Promise:确保你可以获取到 authenticateGamer 的结果并根据结果进行相应的处理。

示例代码

gamerService.js

首先,修改 authenticateGamer 函数,使其返回一个Promise:

const q = require('generic-pool');
const mysql = require('mysql');

// 创建连接池
const poolConfig = {
  max: 10,
  min: 0,
  idleTimeoutMillis: 30000,
};

const pool = new q.Pool({
  create: () => {
    return mysql.createConnection({
      host: 'localhost',
      user: 'root',
      password: 'password',
      database: 'your_database'
    });
  },
  destroy: (client) => {
    return client.end();
  },
}, poolConfig);

exports.authenticateGamer = function(username, password) {
  return new Promise((resolve, reject) => {
    pool.acquire((err, client) => {
      if (err) {
        reject(err);
      } else {
        client.query(
          "SELECT * FROM gamer WHERE username = ? AND password = ?",
          [username, password],
          (queryErr, results) => {
            pool.release(client);
            if (queryErr) {
              reject(queryErr);
            } else {
              resolve(results);
            }
          }
        );
      }
    });
  });
};

routes.js

然后,在 login 函数中处理这个Promise:

const gamerService = require('./gamerService');

exports.login = function(req, res) {
  const gamerName = req.body.loginUser;
  const password = req.body.loginPwd;

  gamerService.authenticateGamer(gamerName, password)
    .then(results => {
      if (results.length > 0) {
        // 登录成功
        res.json({ success: true, message: "Login successful!" });
      } else {
        // 登录失败
        res.status(401).json({ success: false, message: "Invalid credentials" });
      }
    })
    .catch(err => {
      console.error(err);
      res.status(500).json({ success: false, message: "Server error" });
    });
};

前端JS代码

最后,更新前端JavaScript代码以处理登录响应:

$(document).ready(function() {
  $('#registerBtn').click(function() {
    if (!$('#reg-name').val()) {
      alert("Username can't be empty!");
      return false;
    }

    if ($('#reg-pwd').val() !== $('#reg-cpwd').val() || !$('#reg-pwd').val()) {
      alert("Passwords are different or empty!");
      return false;
    }
  });

  $('#loginBtn').click(function() {
    $.ajax({
      url: '/login',
      method: 'POST',
      data: {
        loginUser: $('#login-user').val(),
        loginPwd: $('#login-pwd').val()
      },
      success: function(response) {
        if (response.success) {
          alert(response.message);
          // 重定向或显示其他内容
        } else {
          alert(response.message);
        }
      },
      error: function() {
        alert("An error occurred during login.");
      }
    });
  });
});

通过这种方式,你可以确保在异步操作完成后正确处理结果,并将结果显示给用户。


exports.authenticateGamer = function (username, password, callback) {
    q.pool.acquire(function (err, client) {
        if (err) {
        }
        else {
            client.query("SELECT * FROM gamer WHERE username = ?, password = ? "
                , [username, password], function (err, data) {
                    if(err) throw err
                    callback(data);
                    q.pool.release(client);
                });
        }
    });
}


app.post("/login", routes.login);

exports.login = function (req, res) {
    var gamerName = req.body.loginUser;
    var password = req.body.loginPwd;

    gamerService.authenticateGamer(gamerName, password, function(data){
        console.log(data);
        res.json(data);
    });
}

$(document).ready(function(){
    $('#registerBtn').click(function(){
        var regName = $('#reg-name').val();
        var regPwd = $('#reg-pwd').val();
        var regCpwd = $('#reg-cpwd').val();
        if(!regName){
            alert("Username can't be empty!");
            return;
        }
        if(regPwd != regCpwd || !regCpwd){
            alert("Passwords are different or empty!");
            return;
        }
        $.post("/login", {loginUser: regName, loginPwd: regPwd}, function(data){
            alert(data);
        });
        return false;
    });
});

感恩啊!!! 不过还是有点小问题:

$.post("/login", {loginUser: regName, loginPwd: regPwd}, function(data){
            alert(data);
        });

这点是不是用到了叫做 "ajax’'的东西? 有了这个html中的form就不是必须的了吧?

在你的代码中,authenticateGamer 函数没有正确地处理异步操作。你需要使用回调函数或 Promise 来处理查询结果,并确保在获取到结果后再进行下一步操作。

以下是改进后的代码:

gamerService.js

exports.authenticateGamer = function(username, password, callback) {
    q.pool.acquire(function(err, client) {
        if (err) {
            callback(err);
            return;
        }

        client.query("SELECT * FROM gamer WHERE username = ? AND password = ?", [username, password], function(err, result) {
            q.pool.release(client);
            if (err) {
                callback(err);
            } else {
                callback(null, result.rows); // 假设 result.rows 是查询结果
            }
        });
    });
};

routes.js

exports.login = function(req, res) {
    var gamerName = req.body.loginUser;
    var password = req.body.loginPwd;

    gamerService.authenticateGamer(gamerName, password, function(err, data) {
        if (err) {
            res.status(500).send({ error: "Server Error" });
        } else {
            if (data.length === 0) {
                res.status(401).send({ error: "Invalid credentials" });
            } else {
                res.send({ success: true, data: data });
            }
        }
    });
};

前端 JavaScript 代码

$(document).ready(function() {
    $('#registerBtn').click(function() {
        if (!$('#reg-name').val()) {
            alert("Username can't be empty!");
            return false;
        }
        if ($('#reg-pwd').val() != $('#reg-cpwd').val() || !$('#reg-pwd').val()) {
            alert("Passwords are different or empty!");
            return false;
        }
    });

    $('#loginBtn').click(function() {
        $.ajax({
            url: '/login',
            method: 'POST',
            data: {
                loginUser: $('#login-user').val(),
                loginPwd: $('#login-pwd').val()
            },
            success: function(response) {
                if (response.error) {
                    alert(response.error);
                } else {
                    alert('Login successful!');
                }
            },
            error: function() {
                alert('An error occurred during login.');
            }
        });
    });
});

在这个示例中,authenticateGamer 函数接受一个回调函数来处理异步操作的结果。前端通过 AJAX 请求发送登录信息,并根据服务器响应来显示相应的提示信息。

回到顶部