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;
};
});
});
感恩!
要解决你遇到的问题,需要确保 authenticateGamer
函数能够正确地处理异步操作,并将查询结果传递给调用者。同时,你需要在 login
函数中正确处理这些异步操作。
解决方法
- 使用Promise封装
authenticateGamer
函数:这样可以在调用该函数时等待结果。 - 在
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 请求发送登录信息,并根据服务器响应来显示相应的提示信息。